バックグラウンドスレッドでSQLiteへのアクセスをシリアライズするだけで十分です。
私の答えはthis recent questionで私は正しい方向にあなたを指摘する必要がありますと思います。
他のところで述べたように、SQLiteは同時読み込みでは問題ありませんが、書き込みのためにデータベースレベルでロックします。つまり、異なるスレッドで読み書きしている場合は、SQLITE_BUSYおよびSQLITE_LOCKEDエラーが発生します。
これを回避するための最も基本的な方法は、ディスパッチキューまたはこのアクセスは、メインスレッド上で行われていないので1の並行性を持っているNSOperationQueue
に(読み取りおよび書き込み)のいずれかにすべて DBアクセスをシリアライズすることですあなたのUIは影響を受けません。
これは明らかに重複した読み書きを停止しますが、同時に読み込みを停止します。それがあなたが取ることができるかどうかは、パフォーマンスヒットかどうかは明らかではありません。
NSOperationQueue *backgroundQueue = [[NSOperationQueue alloc] init];
[backgroundQueue setMaxConcurrentOperationCount:1];
あなたが合うように次に、あなただけのキューに操作を追加することができます。上記のようにキューを初期化するために
。
使用しているクエリを調整し、クエリプランを調べて、インデックスが必要かどうか確認しましたか? –
複数の書き込みを行うときにトランザクションを使用していますか?あなたはすべきです - それは大きな違いをもたらします。 –
Frederick Cheung:私は複数の書き込みと取り込みを使用しています。私はインデックス作成が助けになるかどうか見ていきますが、挿入するレコードがたくさんあるので、インデックス作成が役に立たないと思います。ホットリックス:私は複数の書き込みを使用するときにトランザクションを行っていません。私は同じロックを使用してデータベースのすべての書き込みのためにこれを行う必要がありますか? – VTS12