2011-08-06 20 views
0

ユーザーが自分のアプリを起動したときに、インターネットの一部のデータをダウンロードして、電話機のsqliteデータベースと同期します。私は別のスレッドでこれを行います。私はsqliteはスレッドセーフではないので、2番目のスレッドでデータベースを更新する代わりに、私はメインスレッドを返し、データベースを更新する予定です。別のスレッドで同期すると、sqliteで同時実行性の問題が発生しますか?

このようにすると、sqlitedbの更新で並行性の問題が発生しないようになりますか?私が知っておくべき他の問題はありますか?

例:

dispatch_async(dispatch_get_global_queue(0, 0), ^{ 

    //downloading data... 

    dispatch_async(dispatch_get_main_queue(), ^{ 
    //update database here 
    } 
} 

答えて

0

通常SQLiteのは技術的には、スレッドセーフであることがコンパイルされている - 複数のスレッドからのアクセスは、データベースまたはSQLiteのコードの誤った行動の破損にはなりません。

しかし、複数のスレッドから同時にSQLiteデータベースにアクセスすると、「敗者」スレッドに「データベースがロックされています」というエラーが発生する可能性があります。これを処理するには、一時的に遅らせて操作を再試行するか、データベースアクセスの周りに個別のロックプロトコルを実装します。

同じスレッドからすべてのアクセスを何らかの方法で行うことができれば、「データベースロックされた」エラーは発生しません.SQLite DBは「幸せ」でなければなりません。ただし、メイン/ UIスレッドでは「長期実行」操作を実行しないようにしてください。メインスレッドで複雑なクエリをディスパッチしたり、多数のレコードを一度に操作したりしないでください。

関連する問題