2012-05-08 20 views
3

私のアプリケーションでは、dispatch_asyncでバックグラウンドスレッドを実行していますが、メインスレッドとバックグラウンドスレッドの両方で同時にデータベースにアクセスすると、データベースにエラーが発生していました。 sqlite3_threadsafe()は常に2を返していました。つまり、2つのスレッドで同じデータベース接続を使用することはできません。戻り値は1です。sqlite3 multithreading in objective c

+0

2つの異なるスレッドから同時にSQLIte DBにアクセスすることはできません。 –

答えて

1

すべてのアクセス文を追加することができますsqliteストアにアクセスすると常にメインスレッド上にあります。

dispatch_async(dispatch_get_main_queue(),^{ 
    //code goes here 
}); 
+0

Tommyが提案したように、専用のカスタムシリアルキューを使用するほうが、メインキューのブロッキング/デッドロックの危険性があります。 – Rob

4

私はあなたが間違ったアプローチをしていると思います。どのようにコンパイルしても、SQLiteは確実にスレッドセーフではありません - the FAQを参照してください。スレッド安全性のためにSQLiteがコンパイルされていても、トランザクションが保留中であるか、または未処理の文が未処理のままである場合、同じデータベースが複数のスレッドから使​​用されないことがあります。

グランドセントラルディスパッチを使用してすべてのSQLiteアクセスをシリアルディスパッチキューに入れるという上記の推奨は、私の意見で進める正しい方法ですが、使用するよりも独自のキューを作成することをお勧めしますあなたが結果を待つときに確実にdispatch_syncすることができるという単純な理由のためのメインキュー。

+2

FMDBソリューションは、正確にそれを行い、データベースとのやりとりのためのキューを作成します。 – Rob

+0

SQLiteをコマンドで氾濫させると、SQLITE_BUSYエラーが発生する可能性があります。可能であれば、これらのコマンドにペースを合わせ、積極的なマルチスレッドを避けるのがベストです。 –

+1

@ tommyありがとうございました:) – user1184202