2012-05-31 9 views
6

私は約1MBのjson文字列をダウンロードし、約1000個の要素を含む必要があるAndroidアプリケーションを作成しています。これらをそれぞれSQLiteデータベースに解析します。これをListActivityに取り込みます。JSON文字列をSQLiteテーブルに解析する最も速い方法は何ですか?

アプリとのやりとりごとにダウンロードと解析を行う必要はありませんが(最初の実行時またはユーザーがデータを更新するときのみ)、私はまだ解析部分それは電話アプリの用語で永遠のように思える!

私は現在、Gsonを使って各jsonオブジェクトを私が定義したカスタムオブジェクトに構文解析し、S​​QLiteOpenHelperを使用してデータベースに入力しています。

私の質問ですが、これをより速く実装する方法はありますか? Gsonを使わずにjsonと直接対話するほうがはるかに速いでしょうか?あるいは、私は下のコードで何か愚かなことをやっているのですか?

ここで私はSQLiteのにJSONを解析するために、私のAsyncTaskで使用している方法です。

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); 
    } 
} 

これはSQLiteOpenHelperを拡張し、私のVegDataHandlerクラスから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バルク挿入でトランザクションを使用するには、少なくとも
  • データベースを開いたり閉じたりしないでください。処理の開始/終了時にこれを1回実行してください。
  • プリコンパイル済みの文を使用してください!
+0

これは素晴らしい、非常にありがとうのヒントです。 json-smartとDBのbulk insertの両方を調べて、より価値の高い秒を削ることができるかどうか確認します。 – simick

関連する問題