2017-04-19 123 views
3

使用ContentResolver.applyBatch和ContentResolver.bulkInsert方法一次添加數千個聯繫人非常緩慢。 Android是否提供了一種不同的方式來批量添加聯繫人,這將大大加快速度?以編程方式批量添加數千個Android聯繫人

我到目前爲止已經試過以下方法:

使用applyBatch(〜每千75秒觸點)

對於每個聯繫人:

  • 創建一個新的ContentValues反對代表原始聯繫人
  • 構建新的ContentProviderOperation以將其插入到RawContacts表中
  • 此操作添加到列表中,並保存其指數
  • 創建ContentValues像姓名和電話號碼等聯繫字段的對象
  • 建立一個新的ContentProviderOperation上述每一個具有反向引用原始接觸插入到數據表插入操作
  • 添加這些操作列表

最後,使用ContentResolver.applyBatch應用所有操作。

使用bulkInsert(〜每千40秒觸點)

對於每個聯繫人:

  • 創建一個新的ContentValues對象來表示一個原始接觸
  • 構建一個新的ContentProviderOperation插入此進入RawContacts表
  • 將此操作添加到列表

然後,使用ContentResolver.applyBatch應用所有操作。這將返回一個ContentProviderResults數組。

現在,對於每個聯繫人:

  • 解析從相應ContentProviderResult原料接觸ID。
  • 構建ContentValues對象數組的所有聯繫人的數據字段,每一個字段的原始接觸ID
  • 使用ContentResolver.bulkInsert插入到這些數據表

問題

  • 在第二種方法中,我首先對RawContacts表條目應用批處理,然後對已批准的數據表應用bulkInsert。這是因爲我無法找到一種方法來提供Data條目的原始聯繫人ID。是否有類似於bulkInsert的反向引用,允許我同時添加RawContacts和Data條目?
  • applyBatch和bulkInsert只能在一個批次中執行如此多的插入操作,然後纔會抱怨事務太大。因此,他們必須應用於每500個聯繫人左右。有沒有辦法改變這個限制?
  • 是否有一些完全不同的,更快捷的方式來一次添加數千個聯繫人?

回答

0

第一種方法你已經表明是正確的道路要走,其他則是快那麼第二種方法,它的安全爲好。

正如你在相同的間歇操作都插入到RawContactsData,如果出現錯誤,一路上,這樣你就不會與任何殭屍信息離開了DB將回滾在該批次之前的更改在任一表中。

爲了加快速度,可以嘗試在不同線程之間劃分工作。

如果您有1000個聯繫人,請創建一個線程來處理前500個,另一個線程處理500個下一個線程,並讓它們同時運行。 如果需要,您可以將其應用於更多的線程。

+0

謝謝,我會給你一個去。雖然我自己對#1和#2實施的測試顯示#2的速度幾乎快了一倍,但我有點困惑。不過,我可以欣賞穩健的論點。 – UtterlyConfused

+0

出於某種原因,當我在不同的線程上應用批處理時,批次必須更小或者我得到一個'TransactionTooLargeException'。當我將批量縮減到可以接受的程度時,最終不會比同步做任何事情更快。也許這是由'ContentResolver'施加的? – UtterlyConfused

相關問題