Bom dia pessoal, essa semana tive que fazer uma carga de dados na minha aplicacao do Android com SQLite, e foi incrivelmente lento o SQLite na inclusão, e lendo a documentação do SQLite descobri que é assim mesmo, ou seja, ele preserva por padrão a integridade dos dados, bom, mas para fazer a carga de dados que eu precisava não poderia demorar tanto, precisava desligar a integridade para que isso ocorre-se num tempo ágil.
Lendo a documentação e o google, achei dois parametros, um é o "synchronous" e outro é o "journal_mode", o segundo desliga totalmente a integridade, num teste básico a minha carga de dados com 40 mil registros levava 53 segundos, utilizando esses parametros levaram 1 segundo. Claro, sem integridade nenhuma. Segue os exemplos.
Para desativar a integridade.
HExecuteSQLQuery(Query,Minhaconexao,hQueryWithoutCorrection,"PRAGMA synchronous = OFF;") HExecuteSQLQuery(Query,Minhaconexao,hQueryWithoutCorrection,"PRAGMA journal_mode = OFF;")
Seu bloco de inclusão aqui...
Para ativar os parametros por default novamente.
HExecuteSQLQuery(Query,Minhaconexao,hQueryWithoutCorrection,"PRAGMA synchronous = FULL;") HExecuteSQLQuery(Query,Minhaconexao,hQueryWithoutCorrection,"PRAGMA journal_mode = DELETE;")
Pronto!, uma inclusão praticamente instantanea.
Segue codigo:
//Ativar Desativar Integridade SQLite import android.database.sqlite.*; import android.content.Context; import android.util.*; import android.database.*; public static String AtivarDesativarIntegridadeSQLite(String sTipo){ String DB_NAME = "O NOME DO SEU ARQUIVO.db"; String alterQuery = ""; SQLiteDatabase db; try { db = getContexteApplication().openOrCreateDatabase(DB_NAME, 0, null); try { if (sTipo.toLowerCase() == "desativar"){ db.execSQL("PRAGMA synchronous = OFF;"); db.rawQuery("PRAGMA journal_mode = OFF;",null); } else{ db.execSQL("PRAGMA synchronous = FULL;"); db.rawQuery("PRAGMA journal_mode = DELETE;",null); } db.close(); return "ok"; } catch(SQLException e) { db.close(); return e.getMessage(); } } catch (SQLException e) { return e.getMessage(); } }
//Utilizando a função no seu aplicativo: //======================== IF InAndroidSimulatorMode() = False THEN sErro is string = AtivarDesativarIntegridadeSQLite("desativar") IF sErro <> "ok" THEN Error(sErro) EndProgram() END ELSE HExecuteSQLQuery(Query,Minhaconexao,hQueryWithoutCorrection,"PRAGMA synchronous = OFF;") HExecuteSQLQuery(Query,Minhaconexao,hQueryWithoutCorrection,"PRAGMA journal_mode = OFF;") END |