使用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個聯繫人左右。有沒有辦法改變這個限制?
- 是否有一些完全不同的,更快捷的方式來一次添加數千個聯繫人?
謝謝,我會給你一個去。雖然我自己對#1和#2實施的測試顯示#2的速度幾乎快了一倍,但我有點困惑。不過,我可以欣賞穩健的論點。 – UtterlyConfused
出於某種原因,當我在不同的線程上應用批處理時,批次必須更小或者我得到一個'TransactionTooLargeException'。當我將批量縮減到可以接受的程度時,最終不會比同步做任何事情更快。也許這是由'ContentResolver'施加的? – UtterlyConfused