Как быстрее всего преобразовать строку JSON в таблицу SQLite?

Я пишу приложение для Android, которому время от времени нужно загружать строку json размером около 1 МБ, содержащую около 1000 элементов, и анализировать каждую из них в базе данных SQLite, которую я использую для заполнения ListActivity.

Несмотря на то, что загрузка и синтаксический анализ не должны выполняться при каждом взаимодействии с приложением (только при первом запуске или когда пользователь решит обновить данные), я все же обеспокоен тем, что часть синтаксического анализа занимает слишком много времени, около двух-трех минут - кажется вечностью в терминах приложения для телефона!

В настоящее время я использую 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;

}

Заранее спасибо за любые ответы.

6
задан Pratik Butani 7 April 2014 в 07:13
поделиться