2012-05-31 78 views
6

我正在編寫一個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; 

} 

在此先感謝您的任何答覆。

+0

您是否試圖找出延遲的原因 - 無論是需要花費時間的下載還是解析? – Rajesh

+0

你想在數據庫中添加批量記錄嗎? –

+0

@Rajesh - 這絕對是花費最多時間的解析。我正在使用publishProgress()方法來顯示下載/解析/膨脹的階段。 – simick

回答

4

首先,您需要確定進食時間最多的部分。從上面的評論看來,JSON解析聽起來像是罪魁禍首。

如果JSON解析是這個問題:
研究和考慮更快的JSON解析器。也許像json-smart

如果SQLite的/ DB批量插入的問題:
See my answer here

一般提示:

  • 回收對象儘可能多地(保持到最低限度)
  • 始終在DB批量插入中至少使用交易
  • 請勿打開/關閉數據庫。在處理的開始/結束處執行一次操作
  • 使用預編譯語句!
+0

這是偉大的,非常感謝提示。我會研究json-smart和DB批量插入,看看我是否可以削減更多寶貴的秒數! – simick

相關問題