2017-02-13 53 views
2

我正在開發一個應用程序(部分功能)以JSON格式從服務器獲取大量項目並將其存儲在本地SQLite數據庫。由於JSON文件很大,因此我使用Gson庫執行提取操作,否則應用程序崩潰是因爲沒有足夠的RAM。因此,我唯一的選擇是將文件作爲流獲取。提高在Android上將JSON流存儲到本地數據庫的性能

的JSON文件結構與此類似:

{ 
    "items": [ 
    { 
     "itemID": "id1", 
     "itemName": "name1" 
    }, 
    { 
     "itemID": "id2", 
     "itemName": "name2" 
    } 
    ] 
} 

我的Java代碼來處理數據流是這樣的:

JsonReader reader = new JsonReader(url_buffered_reader); 
reader.beginObject(); 

String itemId = null; 
String itemName = null; 

while (reader.hasNext()) { 
    if (reader.nextName().equals("items")) { 
     reader.beginArray(); 
     while (reader.hasNext()) { 
      reader.beginObject(); 
      while (reader.hasNext()) { 
       String name = reader.nextName(); 
       switch (name) { 
        case "itemID": 
         itemId = reader.nextString().trim(); 
         break; 
        case "itemName": 
         itemName = reader.nextString().trim(); 
         break; 
        default: 
         reader.skipValue(); 
         break; 
       } 
      } 
      reader.endObject(); 

      storeItemData(itemId, itemName); 
     } 
     reader.endArray(); 
    } 
} 

功能storeItemData(String id, String name)看起來是這樣的(這是一個類延伸SQLiteOpenHelper):

public void storeItemData(String id, String name) { 
    SQLiteDatabase db = this.getWritableDatabase(); 

    ContentValues values = new ContentValues(); 
    values.put("itemID", id); 
    values.put("itemName", name); 

    long newRowId = db.insertWithOnConflict(
      "items", 
      null, 
      values, SQLiteDatabase.CONFLICT_REPLACE); 
} 

該代碼正在工作精細。數據已成功下載並存儲。問題是表現不好。有沒有更有效的方法來存儲數據,以便提高性能?

回答

1

將記錄插入數據庫會產生開銷。假設數據庫是你的瓶頸,你應該能夠通過將插入包裝到事務中來提高寫入性能。

  1. 移動SQLiteDatabase db = this.getWritableDatabase();滿分storeItemData
  2. 在開始插入之前,請致電db.beginTransaction();
  3. 撥完db.setTransactionSuccessful();然後db.endTransaction();完成插入後。
  4. 請務必捕獲任何異常,以便優雅地處理插入可能導致的任何錯誤。
+0

謝謝!我實際上是在做第一個,但是我將它移到了函數中,這樣我就不必複製粘貼大量不必要的代碼。關於'db.beginTransaction();'和'db.endTransaction();',我應該把它們放在JSON循環之前和之後嗎?根據我的理解,當達到'db.endTransaction();'時,他們會提交所有內容,而不是爲每個記錄做對嗎? – jackgu1988

+1

循環之前和之後都應該正常工作,只要你正在執行所有的'storeItemData'調用。是的,當達到'endTransaction'時,所有的插入都會提交。 – Tim

+0

這正是我所希望的!我甚至可以在網絡監視器上看到連接穩定,而在每秒停止保存數據之前再次感謝。 – jackgu1988