データベースへの sqlite アクセスが iOS でスレッドセーフかどうかを判断しようとしています。私は App Store 以外のアプリ (または起動デーモン) を作成しているので、Apple の承認は問題になりません。問題のデータベースは組み込みのsms.dbであるため、OS も読み取りと書き込みのためにこのデータベースにアクセスしていることは確かです。私はそれを安全に読むことができるようにしたいだけです。
sqlite を使用した複数のプロセスからの読み取りについて、これを読みました。
複数のプロセスが同時に同じデータベースを開くことができます。複数のプロセスが同時に SELECT を実行できます。ただし、いつでもデータベースに変更を加えることができるプロセスは 1 つだけです。
スレッドセーフは sqlite からコンパイルできることを理解しており、それsqlite3_threadsafe()
を使用してこれをテストできます。これを iOS 5.0.1 で実行する
int safe = sqlite3_threadsafe();
結果は 2 になります。これによると、ミューテックス ロックが使用可能であることを意味します。しかし、それは必ずしもそれが使用されているという意味ではありません。
スレッドセーフが接続ごと、データベースごと、またはグローバルベースで動的に有効化されているかどうかは完全にはわかりません。
私もこれを読みました。安全なマルチスレッドを有効にするために使用できるように見えますsqlite3_config()
が、もちろん、OS 自体がこの呼び出しをどのように使用したかを制御または可視化することはできません (そうですか?)。アプリでその呼び出しを再度行った場合、データベースを安全に読み取ることができますか?それとも、同じデータベース ハンドルを使用するアプリ内の複数のスレッドに対する同時アクセスの競合のみを解決するでしょうか?sqlite3
とにかく、私の質問は...
iOS からもアクセスされるこのデータベースを安全に読み取ることができますか?