Я пишу приложение для Android, которое иногда должно загружать json-строку около 1 МБ и содержать около 1000 элементов и анализировать каждую из них в базе данных SQLite, которую я использую для заполнения ListActivity.Каков самый быстрый способ разбора строки JSON в таблицу SQLite?
Несмотря на то, что загрузка и синтаксический анализ не являются чем-то необходимым для каждого взаимодействия с приложением (только при первом запуске или при выборе пользователем обновления данных), я по-прежнему обеспокоен тем, что часть синтаксического анализа занимает слишком много времени, примерно через две-три минуты - кажется, что это вечность в терминах телефона!
В настоящее время я использую Gson для анализа каждого объекта json в пользовательском объекте, который я определил, а затем с помощью SQLiteOpenHelper для его ввода в базу данных.
Мой вопрос: есть ли более быстрый способ реализации этого? Было бы заметно быстрее напрямую взаимодействовать с json, не используя Gson? Или я делаю что-то глупое в коде ниже, что замедляет работу?
Вот метод я использую в моем 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);
}
}
Это метод addCompany из моего VegDataHandler класса, который простирается SQLiteOpenHelper:
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();
}
Этот это класс, который содержит каждый элемент json перед добавлением в SQLite (я кратко опускал геттеры и сеттеры для краткости).
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