AsyncQueryHandler
bulkInsert
はおそらくこのメソッドが挿入のアトミック性を保証しないため、bulkInsert
をサポートしていません。これは何を意味するのでしょうか?さて、何らかの理由でstartInsert
が失敗した場合、挿入は行われません。つまり、「挿入しない」または「挿入した」のいずれかを持つことができます。 2つのオプションしかありません。アトミシティは維持される。すなわち、失敗した場合、基礎となるデータソースは以前と同じままである。
何らかの理由で10項目のうちbulkInsert
が途中で失敗する場合は、3つの項目が挿入されるか、5つの項目が挿入されることがあります。したがって、原子性はありません。これは、ContentProvider
がbulkInsert
をオーバーライドせず、暗黙的にinsert
を複数回使用して終了したときに発生します。したがって、各項目が挿入された後、トランザクションは成功したとみなされ、コミットされます。これは、10個のアイテムについて10個のトランザクションが発生し、いずれかに障害が発生した場合、データソースの前の状態にロールバックしないことを意味します。操作のアトミック性が失われます。
しかし、これは悪いです。 ContentProvider
を所有していて、bulkInsert
をオーバーライドし、アトミック性が維持されていることを確認したらどうでしょうか?次にAsyncQueryHandler
を使用してbulkInsert
を実行できるはずです。 https://github.com/Madrapps/AsyncQueryライブラリはそれを正確に行います。 AndroidのAsyncQueryHandler
と同じですが、bulkInsert
をサポートしています。
アトミック性が懸念される場合は、を使用してbulkInsert
を処理できることを確認してください。
CursorLoaderの問題は、挿入操作と削除操作を行う必要がある場合です。これらの操作には使用できません。 –
詳細はこのリンクを参照することができますhttp://stackoverflow.com/questions/11131058/how-to-properly-insert-values-into-the-sqlite-database-using-contentproviders-i –
私は見ましたこの答え。それらの人は "getContentResolver()。insert(Uri、ContentValues);"を使用するように指示します。問題は、この種の挿入はメインスレッドUIに起こることです。バックグラウンドスレッドに挿入する必要があります。 –