2012-11-26 69 views
4

我意識到這在包括堆棧溢出的here在內的各個地方都有所涉及,但我正在尋找其他人可能使用過的解決方案。因此,考慮到這一點......插入5000多個Android聯繫人的最有效方法

我正在開發一個應用程序,用戶最初可以將所有聯繫人與桌面應用程序OTA同步。這是通過一個Web服務調用完成的,該服務從服務器獲取一組100個聯繫人,下載並解析信息,將聯繫人插入到Android聯繫人數據庫中,確認接收到這些聯繫人,然後重複以前的步驟的100個聯繫人,直到同步完成。當用戶有訂單或1000-2000的聯繫人時,此流程運行良好,但此應用的典型用戶可輕鬆擁有5000-6000個聯繫人(超過10000+的超級用戶),在這種情況下,事情要比我長我喜歡。例如,一組大約5300個聯繫人可能需要大約13.5分鐘才能完成。不錯,但我希望它至少與iOS相同,如果可能的話,它會爲相同的數據集運行大約8分鐘。

我記錄了每一步所需的時間,並且,毫不奇怪,瓶頸似乎是將數據插入到Android合約數據庫中。在瀏覽網頁後,我發現插入數千個聯繫人方面沒有什麼幫助,但是我發現似乎屬於這三個組:

1)ContentProviderOperation - Google推薦的方法,它給了我基線5300名聯繫人爲13.5分鐘。

2)批量插入 - 我讀了builkInsert比applyBatch更高效,但是當我試圖自己實現這個時,實際上它花費了25分鐘來處理同樣的5300個聯繫人。我有一種感覺很多,這是因爲我需要插入RawContact信息,然後保存生成的URI以用於爲bulkInsert創建ContactsContract.Data,這通過ContentProviderOperation中的backValueReference更自然。另外,我查看了android源代碼,並沒有感覺到bulkInsert非常高效。

3)使用DatabaseUtils.InsertHelper和transactions創建優化的批量插入 - 不幸的是,這似乎適用於那些創建自己的內容提供者的人,因爲您需要訪問底層數據庫作爲實例變量,還沒有看到如何使用本地聯繫人數據庫來完成。

有沒有人有任何插入5000多個聯繫人的經驗或任何其他可能的想法,我可以看看,以幫助減少我的時間?還是應該將ContentProviderOperation視爲已獲得優化?

+0

如果你唯一的指標是「和iOS一樣好」,你可能會發現這個和其他任務是不可能的。由於不同的優化,每個平臺都會有不同的優勢。 – Tyrsius

+0

1)vs 2)在很大程度上取決於實現細節。兩者都捆綁了一堆操作,而默認實現只會執行單個操作而不是事務。留下最適合你的東西,你不能優化供應商的內部實施 – zapl

+0

這可能是一個公平的迴應。也許這個指標應該比目前的13.5分鐘更快。我完全理解有一點蘋果比較桔子,但說13分鐘似乎非常緩慢。特別是鑑於用戶擁有10000多個聯繫人的情況並不罕見。 – prestona

回答

0

不幸的是,我相信1是最好的選擇。我懷疑與iPhone相比你的大部分開銷是在內容提供者設計固有的跨進程IPC中。

您對3的分析是正確的。

有根植設備繞過內容提供商的選項,但我懷疑這是你在找什麼。