我正在編寫一個Android應用程序,它偶爾需要下載一個大約1MB的JSON字符串並且包含大約1000個元素,並將其中的每一個解析到一個SQLite數據庫中,我用它來填充一個ListActivity。將JSON字符串解析爲SQLite表的最快方法是什麼?
儘管下載和解析不是每次與應用程序進行交互時都需要完成的操作(僅在第一次運行時或用戶選擇刷新數據時),但我仍然擔心解析部分時間過長,大約需要兩到三分鐘 - 這似乎是電話應用條款中的永恆!
我正在使用Gson將每個json對象解析爲我定義的自定義對象,然後使用SQLiteOpenHelper將其輸入到數據庫中。
我的問題是 - 是否有一個更快的方式來實現呢?在不使用Gson的情況下直接與json進行交互會顯着快嗎?或者我在下面的代碼中做了一些愚蠢的事情,這會減慢速度?
下面是我用我的AsyncTask解析JSON到SQLite的方法:
protected Boolean doInBackground(Integer... bType) {
InputStream source = getJsonInputStream(bTypeString);
VegDataHandler db = new VegDataHandler(mainActivity, bTypeString);
Gson gson = new Gson();
Reader reader = new InputStreamReader(source);
JsonParser jParser = new JsonParser();
JsonArray jArray = jParser.parse(reader).getAsJsonArray();
aLength = jArray.size();
mCurrProgress = 1;
publishProgress(mCurrProgress, 0, aLength);
/* Each array element is of the form { company: {...} } */
int i = 0;
mCurrProgress = 2;
for (JsonElement obj : jArray) {
Company c = gson.fromJson(obj.getAsJsonObject().getAsJsonObject("company"), Company.class);
db.addCompany(c);
i++;
publishProgress(mCurrProgress, i);
}
}
這是從我VegDataHandler類,它擴展SQLiteOpenHelper的addCompany方法:
public void addCompany(Company c) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_ID, c.getCompanyId());
values.put(KEY_NAME, c.getCompanyName());
values.put(KEY_RYG, c.getCompanyRedYellowGreen());
values.put(KEY_COUNTRY, c.getCompanyCountry());
values.put(KEY_URL, c.getCompanyUrl());
values.put(KEY_NOTES, c.getCompanyNotes());
values.put(KEY_EMAIL, c.getCompanyEmail());
db.insertWithOnConflict(TABLE_COMPANY, null, values, SQLiteDatabase.CONFLICT_REPLACE);
db.close();
}
這是在添加到SQLite之前保存每個json元素的類(爲簡潔起見,我省略了getter和setter)。
public class Company {
public Company() {
}
@SerializedName("id")
public int companyId;
@SerializedName("company_name")
public String companyName;
@SerializedName("red_yellow_green")
public String companyRedYellowGreen;
@SerializedName("country")
public String companyCountry;
@SerializedName("url")
public String companyUrl;
@SerializedName("notes")
public String companyNotes;
@SerializedName("email")
public String companyEmail;
}
在此先感謝您的任何答覆。
您是否試圖找出延遲的原因 - 無論是需要花費時間的下載還是解析? – Rajesh
你想在數據庫中添加批量記錄嗎? –
@Rajesh - 這絕對是花費最多時間的解析。我正在使用publishProgress()方法來顯示下載/解析/膨脹的階段。 – simick