私はAndroidアプリケーションを作成しています。このアプリケーションでは、約1MBの約1000個の要素を含むjson文字列をダウンロードし、これらをそれぞれ解析してSQLiteデータベースに変換します。これを使用してListActivityにデータを入力します。
ダウンロードと解析は、アプリとのすべての対話で実行する必要があるものではありませんが(最初の実行時、またはユーザーがデータの更新を選択した場合のみ)、解析部分に時間がかかりすぎるのではないかと心配しています。 、約2〜3分で-電話アプリの用語では永遠のようです!
現在、Gsonを使用して各jsonオブジェクトを解析し、定義したカスタムオブジェクトに変換してから、SQLiteOpenHelperを使用してデータベースに入力しています。
私の質問は-これを実装するより速い方法はありますか?Gsonを使用せずに、jsonと直接対話する方が著しく高速でしょうか?それとも私は物事を遅くしている以下のコードで愚かなことをしていますか?
jsonをSQLiteに解析するために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要素を保持するクラスです(簡潔にするために、ゲッターとセッターは省略しています)。
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;
}
返信をよろしくお願いします。