2013-05-08 4 views
0

Я пытаюсь вставить около 2800 записей в базу данных sqlite, это занимает 150 секунд, что слишком много! Может кто-нибудь рассказать, как оптимизировать эту вставку.Вставка базы данных занимает слишком много времени android sqlite

public void createVariantEntry(ArrayList<ArrayList<String>> str) { 
     InsertHelper ih = new InsertHelper(Database, VARIANT_TABLE_NAME); 
     final int varid = ih.getColumnIndex(VARIANT_ID); 
     final int varmakeid = ih.getColumnIndex(VARIANT_MAKE_ID); 
     final int varmodid = ih.getColumnIndex(VARIANT_MODEL_ID); 
     final int varname = ih.getColumnIndex(VARIANT_NAME); 
     final int varposteddate = ih.getColumnIndex(VARIANT_POSTED_DATE);    
     for(int i=0;i<1253;i++) 
     {   
      ih.prepareForInsert(); 
      ih.bind(varid, str.get(i).get(0)); 
      ih.bind(varmakeid, str.get(i).get(1)); 
      ih.bind(varmodid, str.get(i).get(2)); 
      ih.bind(varname, str.get(i).get(3)); 
      ih.bind(varposteddate, str.get(i).get(4)); 
      ih.execute(); 
     }      
     for(int i=1255;i<str.size();i++) 
     {    
      ih.prepareForInsert(); 
      ih.bind(varid, str.get(i).get(0)); 
      ih.bind(varmakeid, str.get(i).get(1)); 
      ih.bind(varmodid, str.get(i).get(2)); 
      ih.bind(varname, str.get(i).get(3)); 
      ih.bind(varposteddate, str.get(i).get(4)); 
      ih.execute(); 
     }   
     ih.close(); 
    } 
+0

Я действительно оставил комментарий к вашему предыдущему вопросу, связанному с этим, я считаю, что вы можете использовать некоторый StringBuilder для составления полной строки, чтобы вызвать меньше процесса вставки. –

+0

Не могли бы вы рассказать о том, как сделать строковый построитель с помощью inserthelper – bharath

+0

, а не о inserthelper, это нужно сделать с помощью rawQuery. –

ответ

2

большой выигрыш в производительности будет получен при использовании транзакций.

try { 
    SQLiteDatabase db = MySQLiteOpenHelper.getWritableDatabse(); 
    ContentValues values = new ContentValues(); 
    db.beginTransaction(); 
    while (more_data_to_insert) { 
     // put the data in 'values' 
     values.put("col_1", data_1); 
     values.put("col_2", data_2); 
     // ... 
     values.put("col_n", data_n); 

     // Insert the row into the database. 
     db.insert("table_name", null, values); 
    } 
    db.setTransactionSuccessful(); 
} catch (SQLiteException e) { 
    // handle your sqlite errors 
} finally { 
    db.endTransaction(); 
} 

и не использовать InsertHelper. его устарело сейчас.

+0

Привет, я использую inserthelper, но когда я запускаю его на устройствах с уровнями api ниже 11, я получаю java.lang.verifyerror, это причина? Потому что я использую устаревший метод ?? –

+0

@DharaShah Я не могу помочь вам без подробностей. поэтому, пожалуйста, откройте новый вопрос и дайте мне знать. я был бы рад помочь :) – kdehairy

+0

oh thats alright. Все решено. благодаря –

2

Вот некоторые общие советы, которые могут помочь вам:

После этого, Вы должны будете сделать некоторые бенчмаркинг и оптимизировать для вашей конкретной ситуации, анализируя производительность против данных честность компромиссов и т. д. Удачи.