2012-03-26 54 views
7

我正在開發具有在一段時間內有超過4K行查詢,數據庫的應用程序,並且每行有90個領域(絃樂)。問題是如果我從數據庫中選擇*,我的光標變得非常大(超過4MB)。 Android中的光標限制爲1MB。 我該如何解決這個問題,或者最優雅的解決方法是什麼? 可以將數據庫拆分爲更小的塊並查詢它們嗎?的Android如何查詢的Android龐大的數據庫(光標大小限制爲1MB)

感謝, Arkde

回答

7

我找到了一種方法來處理這個問題,我想與所有誰需要它來分享。

int limit = 0; 
    while (limit + 100 < numberOfRows) { 
     //Compose the statement 
     String statement = "SELECT * FROM Table ORDER someField LIMIT '"+ limit+"', 100"; 
     //Execute the query 
     Cursor cursor = myDataBase.rawQuery(statement, null); 
     while (cursor.moveToNext()) { 
      Product product = new Product(); 
      product.setAllValuesFromCursor(cursor); 
      productsArrayList.add(product); 
     } 
     cursor.close(); 
     limit += 100; 
} 

//Compose the statement 
String statement = "SELECT * FROM Table ORDER someField LIMIT '"+ (numberOfRows - limit)+"', 100"; 
//Execute the query 
Cursor cursor = myDataBase.rawQuery(statement, null); 

while (cursor.moveToNext()) { 
    Product product = new Product(); 
    product.setAllValuesFromCursor(cursor); 
    productsArrayList.add(product); 
} 
cursor.close(); 

主要想法是分割你的數據,所以你可以使用它應該使用的光標。如果你有索引表,它在5k行下工作2s。

感謝, Arkde

1

你需要所有這些行的同時?你可以把它們分成幾部分?此問題已被多次詢問:Android SQLite and huge data sets

這裏還有一個建議:如果您有90個需要修改的字段,請將它們分成10個不同的視圖。在每個視圖上都有一個左箭頭和右箭頭,以便您可以水平遍歷屏幕。因此每個視圖將顯示9個字段。或者像那樣的一些策略。基本上這些都是除了列名以外的所有相同的視圖,所以你不應該修改很多代碼。

+0

是的,我需要所有這些行的同時,因爲我需要他們存儲在一個ArrayList填充和適配器列表視圖。問題似乎是存儲在光標中的對象的大小與行數不同(在您的建議鏈接中回答的問題中,存在行數問題) – Arkde 2012-03-26 14:28:40

+0

該限制適用於整體數據,無論是這是由於大量的行或真正的大列或許多列。我不知道任何其他的選擇,但以某種方式壓縮你的數據。 – Sid 2012-03-26 14:32:22

+0

任何想法如何壓縮我的數據?我使用String來存儲它們,因爲字符串的大小隨着字符數量的增加而增長......我不知道任何其他方式來優化這一點。 – Arkde 2012-03-26 14:35:21

0

那麼作爲一項規則,你永遠不會做選擇*。一開始,每一行都有一個唯一的標識符,而你的用戶只想選擇特定的行和列 - 也就是說他們可以在android屏幕上看到什麼。不顯得粗魯,這是一個非常基本的問題。你只返回要顯示在手機上該屏幕列和行 - 否則,你消耗unnecssary電池壽命transfering從未被diaplayed數據。標準方法是使用參數化存儲過程。谷歌參數化存儲過程並做一些閱讀 - 通過by - 你無法更新任何表,如果沒有返回該表的唯一行標識符。

+0

我必須做一個select *,因爲不幸的是,我需要使用所有的字段。用戶將編輯一些字段,其他字段將用於不同的設置。 – Arkde 2012-03-26 14:33:49

+0

在這種情況下,我會使用動態SQL,其中的字段名是由用戶從複選框列表中選擇它們以及需要更新的所有隱藏字段生成的,然後轉到詳細信息視圖。你也可以做一個動態更新語句。我仍然不知道如何在典型的android顯示屏上獲取所有數據。 – 2012-03-27 15:42:23

2

伊恩·P是絕對正確的。爲了擴大他的答案,如果你有90個領域,你可能沒有使用最有效的策略。你需要有多個表格,你通過ID鏈接。你永遠不應該把你可能需要或不需要的每個變量都塞進一張表中。這就是爲什麼你超過規模。即使你只是複製一個90列的大型Excel電子表格,你也應該設計一次只檢索幾個。移動用戶絕對不會等待該查詢。他們不會。 @ 3G速度您需要潛在用戶的LOT。你不僅要求他們坐下來等待,直到他們看到5分鐘內沒有任何事情發生,你也基本上要求珍貴的電池壽命。

1MB大方。如果您根據需要檢索數據並使用高效的編碼策略,則1MB將比您以往需要的要多。