私のアプリケーションでは、dispatch_asyncでバックグラウンドスレッドを実行していますが、メインスレッドとバックグラウンドスレッドの両方で同時にデータベースにアクセスすると、データベースにエラーが発生していました。 sqlite3_threadsafe()は常に2を返していました。つまり、2つのスレッドで同じデータベース接続を使用することはできません。戻り値は1です。sqlite3 multithreading in objective c
答えて
すべてのアクセス文を追加することができますsqliteストアにアクセスすると常にメインスレッド上にあります。
dispatch_async(dispatch_get_main_queue(),^{
//code goes here
});
Tommyが提案したように、専用のカスタムシリアルキューを使用するほうが、メインキューのブロッキング/デッドロックの危険性があります。 – Rob
私はあなたが間違ったアプローチをしていると思います。どのようにコンパイルしても、SQLiteは確実にスレッドセーフではありません - the FAQを参照してください。スレッド安全性のためにSQLiteがコンパイルされていても、トランザクションが保留中であるか、または未処理の文が未処理のままである場合、同じデータベースが複数のスレッドから使用されないことがあります。
グランドセントラルディスパッチを使用してすべてのSQLiteアクセスをシリアルディスパッチキューに入れるという上記の推奨は、私の意見で進める正しい方法ですが、使用するよりも独自のキューを作成することをお勧めしますあなたが結果を待つときに確実にdispatch_syncすることができるという単純な理由のためのメインキュー。
FMDBソリューションは、正確にそれを行い、データベースとのやりとりのためのキューを作成します。 – Rob
SQLiteをコマンドで氾濫させると、SQLITE_BUSYエラーが発生する可能性があります。可能であれば、これらのコマンドにペースを合わせ、積極的なマルチスレッドを避けるのがベストです。 –
@ tommyありがとうございました:) – user1184202
- 1. c#System.MissingMethodException in sqlite3
- 2. Delphi TList in multithreading
- 3. com.android.camera.action.CROP in objective-c?
- 4. Regex in Objective-c
- 5. Objective-C in web development
- 6. サブストリングchar * in Objective C
- 7. For ... inステートメントObjective-C
- 8. (void)^(void)in objective-c?
- 9. Objective-C Loop in NSThread
- 10. sqlite3 objective cxcode
- 11. objective-c BAD ACCESS in recursion
- 12. iPhone:オーディオ分析in objective-c
- 13. Apple Push Notification Development in Objective-C
- 14. Objective-C for inループネストNSDictionaries
- 15. -rewrite-objcとObjective-C in clang
- 16. Objective-C/Cocoa bridge in PHP?
- 17. TRANSACTION in java + sqlite3
- 18. sqlite3 in Python
- 19. MultiThreading WebBrowserコントロールC#STA
- 20. C++のCanon EDSDK MultiThreading
- 21. C++ multithreading:条件変数
- 22. C#WPF UI Freeze Issue MultiThreading
- 23. sqlite3はテキスト内のスペースを受け入れません(Objective-C)
- 24. Xcode、Objective-Cでテーブル名をSqlite3で見つけよう
- 25. C#Invoke、Invokerequired&Multithreadingに関する質問
- 26. python multithreading question
- 27. multithreading scope
- 28. Ehcache&MultiThreading
- 29. jython multithreading
- 30. stringstreamとmultithreading
2つの異なるスレッドから同時にSQLIte DBにアクセスすることはできません。 –