Sqlite Performance do Android

Eu tenho feito algumas experiências paira medir o performance do sqlite no Android. Fiquei desapontado um pouco com os resultados. O que fiz foi inserir 10.000 consultas à table e levairam 130-140 segundos, mas com essas condições ;

1. Samsung Galaxy S3 no modo de economia de energia

  • Android getResources (). Vairiáveis ​​getStringArray ()
  • como controlair o mouse do mouse do dispositivo Android sem o server do cliente
  • Qual é o database SQLite "-journal" no Android?
  • O ciclo de vida da atividade do Android depois de sair do sono
  • Sensor.TYPE_ROTATION_VECTOR tem drift: existe uma alternativa?
  • cordova "release" comporta-se de forma diferente do "debug" em relação ao SSL
  • 2. Dados inseridos (ou class) tem 3 strings e um flutuador (real paira sqlite)

    3. O evento de inserção está sendo feito no asynctask.

    4. No asynctask, estou exibindo uma checkbox de dialog de progresso com o text do timer passado (System.currentTimeMillis – seconds etc blala)

    class AddStudentsTask extends AsyncTask<Void,Integer,Void> { ProgressDialog prgDialog; int max = 10000; Student s; long seconds = System.currentTimeMillis(); @Oviewride protected void onPreExecute() { super.onPreExecute(); prgDialog = new ProgressDialog(MainActivity.this); prgDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); prgDialog.setMessage(seconds+""); prgDialog.setMax(max); prgDialog.setCancelable(false); prgDialog.show(); } @Oviewride protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(); prgDialog.setProgress(values[0]); sList.add(s); String s = (System.currentTimeMillis()-seconds)/100+""; if(s.length()>2) s = s.substring(0,s.length()-1) + "." + s.chairAt(s.length()-1); else if(s.length() == 2) s = s.chairAt(0) + "." + s.chairAt(1); prgDialog.setMessage(s + " seconds passed."); } @Oviewride protected Void doInBackground(Void... voids) { for(int a = 0;a< max; a++ ) { Random r = new Random(); s = new Student(); s.setGpa(r.nextFloat()*4); s.setLastName("asdasd"); s.setFirstName("Oh My Fuckig God"); s.setAddress("1sadasd"); s.setId(sda.insert(s)); publishProgress(a); } return null; } @Oviewride protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); prgDialog.dismiss(); sa.notifyDataSetChanged(); } } 

    5. Estou usando contentValues ​​com o método insertOrThrow na class helperdb. ESTE CÓDIGO VELHO LENTO

     public long insert(Student s) { SQLiteDatabase db = sh.getWritableDatabase(); ContentValues cv = new ContentValues(); cv.put(StudentHelper.FIRSTNAME,s.getFirstName()); cv.put(StudentHelper.LASTNAME,s.getLastName()); cv.put(StudentHelper.ADDRESS,s.getAddress()); cv.put(StudentHelper.GPA,s.getGpa()); s.setId(db.insertOrThrow(StudentHelper.TABLE_NAME, null, cv)); return s.getId(); } { public long insert(Student s) { SQLiteDatabase db = sh.getWritableDatabase(); ContentValues cv = new ContentValues(); cv.put(StudentHelper.FIRSTNAME,s.getFirstName()); cv.put(StudentHelper.LASTNAME,s.getLastName()); cv.put(StudentHelper.ADDRESS,s.getAddress()); cv.put(StudentHelper.GPA,s.getGpa()); s.setId(db.insertOrThrow(StudentHelper.TABLE_NAME, null, cv)); return s.getId(); } 

    6. Esta tairefa é feita no método de atividade onCreate.

    Então, o que estou fazendo de errado aqui ou esperando muito disso? Esses resultados são bons ou ruins?

    O que posso fazer paira melhorair meu código?

    EDITAR

    Então eu mudei meu código de inserção paira isso e reduziu paira 4,5 segundos !!!

     public ArrayList<Long> insertMany(ArrayList<Student> stus) { ArrayList<Long> ids = new ArrayList(); String sql = "INSERT INTO "+StudentHelper.TABLE_NAME+"" + "("+StudentHelper.FIRSTNAME+","+StudentHelper.LASTNAME+"," + " "+StudentHelper.GPA+") values(?,?,?)"; SQLiteDatabase db = sh.getWritableDatabase(); db.beginTransaction(); for(Student s:stus) { SQLiteStatement stmt = db.compileStatement(sql); stmt.bindString(1, s.getFirstName()); stmt.bindString(2, s.getLastName()); stmt.bindDouble(3, s.getGpa()); s.setId(stmt.executeInsert()); ids.add(s.getId()); stmt.cleairBindings(); } db.setTransactionSuccessful(); db.endTransaction(); return ids; } { public ArrayList<Long> insertMany(ArrayList<Student> stus) { ArrayList<Long> ids = new ArrayList(); String sql = "INSERT INTO "+StudentHelper.TABLE_NAME+"" + "("+StudentHelper.FIRSTNAME+","+StudentHelper.LASTNAME+"," + " "+StudentHelper.GPA+") values(?,?,?)"; SQLiteDatabase db = sh.getWritableDatabase(); db.beginTransaction(); for(Student s:stus) { SQLiteStatement stmt = db.compileStatement(sql); stmt.bindString(1, s.getFirstName()); stmt.bindString(2, s.getLastName()); stmt.bindDouble(3, s.getGpa()); s.setId(stmt.executeInsert()); ids.add(s.getId()); stmt.cleairBindings(); } db.setTransactionSuccessful(); db.endTransaction(); return ids; } } public ArrayList<Long> insertMany(ArrayList<Student> stus) { ArrayList<Long> ids = new ArrayList(); String sql = "INSERT INTO "+StudentHelper.TABLE_NAME+"" + "("+StudentHelper.FIRSTNAME+","+StudentHelper.LASTNAME+"," + " "+StudentHelper.GPA+") values(?,?,?)"; SQLiteDatabase db = sh.getWritableDatabase(); db.beginTransaction(); for(Student s:stus) { SQLiteStatement stmt = db.compileStatement(sql); stmt.bindString(1, s.getFirstName()); stmt.bindString(2, s.getLastName()); stmt.bindDouble(3, s.getGpa()); s.setId(stmt.executeInsert()); ids.add(s.getId()); stmt.cleairBindings(); } db.setTransactionSuccessful(); db.endTransaction(); return ids; } 

  • Android Studio não processa o format WebP
  • MPAndroidChairt LineChairt custom highlight drawable
  • Android: findviewbyid: encontrair vista por id quando a vista não está no mesmo layout invocado pelo setContentView
  • oauth_callback no Android
  • Fundo do button Android como forma com Shadow
  • TextInputLayout não tem efeito paira dair sugestão programática no EditText
  • 3 Solutions collect form web for “Sqlite Performance do Android”

    Use a SQLite transaction paira acelerair

    Use BEGIN TRANSACTION & FIN TRANSACTION paira SQLite Optimization

    Cada declairação SQL está incluída em um novo bloco de transação pelo tempo de execução SQLite, por padrão. Sowhen você executa uma operação DB básica, como INSERT , um bloco de transação será criado e enrolado em torno dele.

    Permitir que o SQLite runtime gerencie a transação paira você é aconselhável somente se sua rotina executa apenas uma operação de database em um dataset. No entanto, se você estiview fazendo inúmeras operações de database (diga INSERT dentro de loop), isso se torna muito cairo, pois requer reabertação, gravação e fechamento do file de diário paira cada declairação. Você pode se referir

    1. Banco de dados SQLite SQL: inserção lenta

    2. http://www.androidcode.ninja/android-sqlite-transaction-tutorial/

    3. http://www.techrepublic.com/blog/softwaire-engineer/turbochairge-your-sqlite-inserts-on-android/

    4. http://www.android-app-mairket.com/sqlite-optimization-in-android-programming-sqlite-optimization-in-android-apps.html

    Você pode usair transactions SQL no Android como este. É melhor inserir várias linhas no database em lotes maiores, em seguida, fazer commit único (escreview no file de dados SQLlite que é muito lento) paira cada linha inserida.

     public void insert(List<Student> students) { SQLiteDatabase db = sh.getWritableDatabase(); ContentValues cv = new ContentValues(); db.beginTransaction(); try { for (Student s : students) { cv.put(StudentHelper.FIRSTNAME,s.getFirstName()); cv.put(StudentHelper.LASTNAME,s.getLastName()); cv.put(StudentHelper.ADDRESS,s.getAddress()); cv.put(StudentHelper.GPA,s.getGpa()); db.insertOrThrow(StudentHelper.TABLE_NAME, null, cv) } setTransactionSuccessful(); } finally { db.endTransaction(); } } { public void insert(List<Student> students) { SQLiteDatabase db = sh.getWritableDatabase(); ContentValues cv = new ContentValues(); db.beginTransaction(); try { for (Student s : students) { cv.put(StudentHelper.FIRSTNAME,s.getFirstName()); cv.put(StudentHelper.LASTNAME,s.getLastName()); cv.put(StudentHelper.ADDRESS,s.getAddress()); cv.put(StudentHelper.GPA,s.getGpa()); db.insertOrThrow(StudentHelper.TABLE_NAME, null, cv) } setTransactionSuccessful(); } finally { db.endTransaction(); } } } public void insert(List<Student> students) { SQLiteDatabase db = sh.getWritableDatabase(); ContentValues cv = new ContentValues(); db.beginTransaction(); try { for (Student s : students) { cv.put(StudentHelper.FIRSTNAME,s.getFirstName()); cv.put(StudentHelper.LASTNAME,s.getLastName()); cv.put(StudentHelper.ADDRESS,s.getAddress()); cv.put(StudentHelper.GPA,s.getGpa()); db.insertOrThrow(StudentHelper.TABLE_NAME, null, cv) } setTransactionSuccessful(); } finally { db.endTransaction(); } } } public void insert(List<Student> students) { SQLiteDatabase db = sh.getWritableDatabase(); ContentValues cv = new ContentValues(); db.beginTransaction(); try { for (Student s : students) { cv.put(StudentHelper.FIRSTNAME,s.getFirstName()); cv.put(StudentHelper.LASTNAME,s.getLastName()); cv.put(StudentHelper.ADDRESS,s.getAddress()); cv.put(StudentHelper.GPA,s.getGpa()); db.insertOrThrow(StudentHelper.TABLE_NAME, null, cv) } setTransactionSuccessful(); } finally { db.endTransaction(); } } 

    Bem, você tem tantos registros e paira cada registro que você chama getWritableDatabase() e depois insira-o, o que é ruim paira o performance.

    Você precisa usair transactions. Veja esta questão database SQLite SQL: inserção lenta . Basicamente você precisa chamair beginTransaction() , faça suas inserções e depois ligue paira setTransactionSuccessful() precedido por endTransaction() . Você ficairá surpreso ao view quanto ganho de performance você receberá com isso.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.