私は約1MBのjson文字列をダウンロードし、約1000個の要素を含む必要があるAndroidアプリケーションを作成しています。これらをそれぞれSQLiteデータベースに解析します。これをListActivityに取り込みます。JSON文字列をSQLiteテーブルに解析する最も速い方法は何ですか?
アプリとのやりとりごとにダウンロードと解析を行う必要はありませんが(最初の実行時またはユーザーがデータを更新するときのみ)、私はまだ解析部分それは電話アプリの用語で永遠のように思える!
私は現在、Gsonを使って各jsonオブジェクトを私が定義したカスタムオブジェクトに構文解析し、SQLiteOpenHelperを使用してデータベースに入力しています。
私の質問ですが、これをより速く実装する方法はありますか? 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;
}
お返事ありがとうございます。
遅延の原因を特定しようとしましたか?ダウンロードに時間がかかっているかどうか、または解析中ですか? – Rajesh
データベースに大量のレコードを追加しますか? –
@Rajesh - これは間違いなく最も時間を要する解析です。私はpublishProgress()メソッドを使用して、ダウンロード/解析/展開の段階を示しています。 – simick