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);
}
該代碼正在工作精細。數據已成功下載並存儲。問題是表現不好。有沒有更有效的方法來存儲數據,以便提高性能?
謝謝!我實際上是在做第一個,但是我將它移到了函數中,這樣我就不必複製粘貼大量不必要的代碼。關於'db.beginTransaction();'和'db.endTransaction();',我應該把它們放在JSON循環之前和之後嗎?根據我的理解,當達到'db.endTransaction();'時,他們會提交所有內容,而不是爲每個記錄做對嗎? – jackgu1988
循環之前和之後都應該正常工作,只要你正在執行所有的'storeItemData'調用。是的,當達到'endTransaction'時,所有的插入都會提交。 – Tim
這正是我所希望的!我甚至可以在網絡監視器上看到連接穩定,而在每秒停止保存數據之前再次感謝。 – jackgu1988