2012-05-31 1 views
6

Я пишу приложение для 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; 

} 

Заранее благодарим за любые ответы.

+0

Вы пытались изолировать причину задержки - независимо от того, загружается ли это время или разбор? – Rajesh

+0

Вы хотите добавить массовые записи в базу данных? –

+0

@Rajesh - это определенно синтаксический анализ, который занимает больше всего времени. Я использую метод publishProgress(), чтобы показать, на каком этапе загрузки/разбора/раздувания он находится. – simick

ответ

4

Сначала вам нужно определить часть (-ы) процесса, которые едут больше всего времени. Из вашего комментария выше это звучит так, как разбор JSON является виновником.

Если JSON синтаксического анализа является вопрос:
Исследования и рассмотрим более быстрый JSON парсер. Возможно, что-то вроде json-smart.

Если SQLite/DB сыпучие вставки вопрос:
See my answer here

Общие советы:

  • корзины объектов как можно больше (держать новый к минимуму)
  • Всегда используйте транзакции в объемных вкладышах DB как минимум
  • Не открывайте и не закрывайте базу данных. Сделайте это один раз в начале/конце обработки
  • Используйте предварительно скомпилированные утверждения!
+0

Это замечательно, спасибо за советы. Я рассмотрю как json-smart, так и DB-вставки, чтобы увидеть, могу ли я сэкономить более ценные секунды! – simick