ContentResolver.applyBatchとContentResolver.bulkInsertメソッドを使用して、何千もの連絡先を一度に追加するのは非常に遅いです。 Androidでは、連絡先を一括追加する方法が大幅に改善されていますか?バルクで数千のAndroid連絡先をプログラムで追加する
私がこれまでに以下のアプローチ試してみた:各連絡先についてapplyBatch(千人の連絡先あたり〜75秒)
を使用して
を:
- 新しいContentValuesはにオブジェクトを作成します生の連絡先を表す
- これをRawContactsテーブルに挿入する新しいContentProviderOperationを作成します。
- がContentValuesに名前と電話番号のような他の連絡先フィールドのためのオブジェクトを作成し、そのインデックスリストにこの操作を追加し、保存
- 生の接触に後方参照を使用したデータテーブルにこれらのそれぞれを挿入するために新しいContentProviderOperationを構築すべての操作を適用するためにContentResolver.applyBatchを使用して、リスト最後に
にこれらの操作を追加し、操作
を使用して
:
- 新しいContentValuesはこれを挿入する新しいContentProviderOperationを構築し、生の接触
- を表現するためにオブジェクトを作成します。 RawContactsテーブルに追加します
- この操作をリストに追加します
次に、ContentResolver.applyBatchを使用してすべての操作を適用します。 ContentProviderResultsの配列を返します。
次に、各コンタクトのために:
- 対応ContentProviderResultから生接触IDを解析。
- データテーブル
質問にこれらを挿入するために、生接触ID
- 第2のアプローチでは、最初にRawContactsテーブルエントリにapplyBatchを実行し、次に入力されたデータテーブルに対してbulkInsertを実行します。これは、そうでない場合はデータ項目の生の連絡先IDを提供する方法を見つけることができないためです。 bulkInsertのバックリファレンスと同様のものがありますが、RawContactsとDataエントリを同時に追加できますか?
- applyBatchとbulkInsertは、トランザクションが大きすぎると不平を言う前に、多くの挿入を1つのバッチでしか実行できません。したがって、500回程度の接触ごとに適用する必要があります。この制限を変更する方法はありますか?
- 何千もの連絡先を一度に追加する方法が全く異なりますか?
ありがとう、私はそれを行ってあげるよ。実装#1と#2のための私自身のテストは、#2がほぼ2倍の速さであることを示して以来、ちょっと混乱しています。しかし、私は堅牢性の議論を理解することができます。 – UtterlyConfused
何らかの理由で、私が別のスレッドで 'applyBatch'を実行すると、バッチを小さくするか、' TransactionTooLargeException'を取得します。バッチサイズを許容可能なものに減らしたら、すべてを同期して行うよりも速く終わることになります。これは 'ContentResolver'によって課されているのでしょうか? – UtterlyConfused