2017-04-19 14 views
3

ContentResolver.applyBatchとContentResolver.bulkInsertメソッドを使用して、何千もの連絡先を一度に追加するのは非常に遅いです。 Androidでは、連絡先を一括追加する方法が大幅に改善されていますか?バルクで数千のAndroid連絡先をプログラムで追加する

私がこれまでに以下のアプローチ試してみた:各連絡先についてapplyBatch(千人の連絡先あたり〜75秒)

を使用して

を:

  • 新しいContentValuesはにオブジェクトを作成します生の連絡先を表す
  • これをRawContactsテーブルに挿入する新しいContentProviderOperationを作成します。
  • がContentValuesに名前と電話番号のような他の連絡先フィールドのためのオブジェクトを作成し、そのインデックスリストにこの操作を追加し、保存
  • 生の接触に後方参照を使用したデータテーブルにこれらのそれぞれを挿入するために新しいContentProviderOperationを構築すべての操作を適用するためにContentResolver.applyBatchを使用して、リスト最後に

にこれらの操作を追加し、操作

  • を挿入します。各連絡先についてbulkInsert(千の接点あたり〜40秒)

    を使用して

    • 新しいContentValuesはこれを挿入する新しいContentProviderOperationを構築し、生の接触
    • を表現するためにオブジェクトを作成します。 RawContactsテーブルに追加します
    • この操作をリストに追加します

    次に、ContentResolver.applyBatchを使用してすべての操作を適用します。 ContentProviderResultsの配列を返します。

    次に、各コンタクトのために:

    • 対応ContentProviderResultから生接触IDを解析。
    • データテーブル

    質問にこれらを挿入するために、生接触ID

  • 使用ContentResolver.bulkInsertするためのフィールドと、連絡先のすべてのデータ・フィールドの各々をContentValuesオブジェクトの配列を構築

    • 第2のアプローチでは、最初にRawContactsテーブルエントリにapplyBatchを実行し、次に入力されたデータテーブルに対してbulkInsertを実行します。これは、そうでない場合はデータ項目の生の連絡先IDを提供する方法を見つけることができないためです。 bulkInsertのバックリファレンスと同様のものがありますが、RawContactsとDataエントリを同時に追加できますか?
    • applyBatchとbulkInsertは、トランザクションが大きすぎると不平を言う前に、多くの挿入を1つのバッチでしか実行できません。したがって、500回程度の接触ごとに適用する必要があります。この制限を変更する方法はありますか?
    • 何千もの連絡先を一度に追加する方法が全く異なりますか?
  • 答えて

    0

    あなたが示したきた第1の方法は行くための正しい方法で、他は、より高速な第二の方法続いている、それは同様に安全です。

    あなたが同じバッチ操作でRawContactsDataに両方を挿入していると、何かが道に沿ってうまくいかない場合は、任意のゾンビ情報が残っていないので、DBは、そのバッチの前回の変更をロールバックしますどちらの表にもあります。

    作業を高速化するには、異なるスレッド間で作業を分割してみてください。

    連絡先が1000人の場合は、トップ500を処理するスレッドを1つ作成し、ボトム500を処理して同時に実行させるスレッドを作成します。 必要に応じて、さらに多くのスレッドに適用できます。

    +0

    ありがとう、私はそれを行ってあげるよ。実装#1と#2のための私自身のテストは、#2がほぼ2倍の速さであることを示して以来、ちょっと混乱しています。しかし、私は堅牢性の議論を理解することができます。 – UtterlyConfused

    +0

    何らかの理由で、私が別のスレッドで 'applyBatch'を実行すると、バッチを小さくするか、' TransactionTooLargeException'を取得します。バッチサイズを許容可能なものに減らしたら、すべてを同期して行うよりも速く終わることになります。これは 'ContentResolver'によって課されているのでしょうか? – UtterlyConfused

    関連する問題