2014-12-04 54 views
5

我有幾個關於Android框架的問題,我找不到android developer's site或其他地方。所以,我很想在這裏問。如何評估Android中ContentProviders的效率?

有人問我這些問題在接受採訪時表示:

您將如何評估ContentProviders在Android的效率?

如果您想要獲取3000個聯繫人,需要多長時間? 如果您想要獲取聯繫人的電子郵件,是否也需要同一時間?

+0

這似乎只是一個查詢表中某列的時間差異問題,而且查詢的不止一個。這應該歸結爲一個數據庫問題,具體來說,在這種情況下,因爲這是Android中的格式默認情況下,SQLite。或者我錯過了什麼? – 2014-12-04 04:43:19

+0

1)「效率」沒有定義的含義。你可以回答任何你想要的。 2a)取決於設備及其速度。 2b)在不知道數據庫模式的情況下不可能知道。而ContentProvider的情況更少,因爲它們根本不需要擁有數據庫。它們可以由RESTful Web服務支持。 – zapl 2014-12-09 00:27:13

回答

2

第一個問題

多少時間,如果你想獲取3000個聯繫人沒有考慮?

- >取決於設備速度,反正時間複雜度是在輸入大小線性:爲O(n)

第二個問題

將它採取相同的時間,如果你想獲取聯繫人的電子郵件爲 以及?

- > AFAIK聯繫人的電子郵件是在數據表的原料接觸子部分,每個聯繫人可以有多個電子郵件,因此可能需要更多的時間來獲取所有比較所有聯繫人的電子郵件以僅獲取聯繫人。

聯繫人提供程序是Android內容提供程序組件。它維護三種類型的數據的一個人,每個對應於由供應商提供的表格,如

enter image description here

更多細節HERE

0

這只是一個select * from table問題。答案從表格中選擇(需要的列)會更有效率。

當投影僅包含您打算使用的列並且您有一個編碼良好的循環來讀取數據時,可以實現從內容提供者讀取的最佳情況。

如果您爲投影傳遞null,它將花費相同的時間,因爲內容提供者的所有列都將返回給這兩個調用。

如果第一個打電話給你傳遞KEY_ID的投影,你通過第二遍{KEY_ID,key_email}第二階段將花費更多的時間,因爲內容提供商將返回更多的數據

的實際時間取決於你如何編碼循環以及你如何處理循環中的數據。例如,如果每個循環執行getColumnIndex(「email」),比進入循環之前確定列索引的優化程序花費的時間要長。

注意沒有moveToFirst()這是對sqllite最快的讀取循環第一次調用moveToNext()爲您執行moveToFirst()。

if (cursor !=null) { 
    //get column indexes here 
while (cursor.moveToNext()){ //processing here } 
} 
cursor.close()} 
1

說明您將如何評估ContentProviders在Android中的效率?

這將通過查詢延遲進行評估。因此,您可以對可能的查詢進行最糟糕的時間測量,並將其與您的應用程序要求進行比較,並查看它是否會導致用戶相當長的等待時間。

多少時間,如果你想獲取3000個聯繫人沒有考慮?

運行代碼和度量。在不同的設備和版本上會有所不同。

如果您還想獲取聯繫人的電子郵件,是否需要同一時間?

電子郵件和休息類型「數據」可能是in same table。每個記錄是每個MIME類型的數據,因此「電子郵件」需要額外的記錄提取。一個格式良好的查詢可以一次獲取多種類型的數據,然後通過其最新的遊標處理代碼來區分它。