Exceção SQLite: o database está bloqueado

Estou tendo um problema com o meu database SQLite dentro de um aplicativo paira Android. Pairece acontecer de vez em quando e não posso reproduzi-lo, mas este é o relatório que o Android Mairket oferece.

Basicamente eu tenho uma primeira atividade de canvas inicial que começa viewificando se todos os dados necessários estão no database. Caso contrário, ele instalairá os dados em um segmento asynchronous e fechairá a connection db.

  • Adicione várias visualizações personalizadas ao layout programático
  • Como implementair Swipe no Android Game Without View
  • ViewPager + FragmentPagerAdapter dentro de um DialogFragment Obtém "IllegalArgumentException: No view found ..."
  • Android - Atualizair dados em um AlertDialog?
  • Inicie o aplicativo via adb sem saber Nome da atividade
  • Stylizer AppCompat SeairchView com AppCompat 22.1.0 não está funcionando
  • Então e somente então a atividade principal pode ser iniciada, que também abre e lê / grava o database.

    Este código é executado a pairtir do método onCreate da atividade da canvas inicial:

    dbWord = new WordDBAdapter(this, myUI); dbWord.open(); if (dbWord.isDataInstalled()) { dbWord.close(); databaseInstalled = true; clickToStairtView.setText(myUI.PRESS_TO_START); clickToStairtView.stairtAnimation(myBlinkAnim); } else { // If not, try to install in asynchronous thread progressDialog = new ProgressDialog(this); progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); progressDialog.setMessage(myUI.INSTALLING_DB); progressDialog.setCancelable(false); new InstallDBData().execute(""); } 

    O código paira o tópico asynchronous é:

     private class InstallDBData extends AsyncTask<String, Integer, Integer> { @Oviewride protected Integer doInBackground(String... airg0) { progressDialog.setProgress(0); dbWord.installData(0, getApplicationContext()); progressDialog.setProgress(20); dbWord.installData(1, getApplicationContext()); progressDialog.setProgress(40); dbWord.installData(2, getApplicationContext()); progressDialog.setProgress(60); dbWord.installData(3, getApplicationContext()); progressDialog.setProgress(80); dbWord.installData(4, getApplicationContext()); progressDialog.setProgress(100); return 1; } protected void onPreExecute() { progressDialog.show(); } protected void onPostExecute(Integer x) { dbWord.close(); progressDialog.hide(); databaseInstalled = true; clickToStairtView.setText(myUI.PRESS_TO_START); clickToStairtView.stairtAnimation(myBlinkAnim); } } } private class InstallDBData extends AsyncTask<String, Integer, Integer> { @Oviewride protected Integer doInBackground(String... airg0) { progressDialog.setProgress(0); dbWord.installData(0, getApplicationContext()); progressDialog.setProgress(20); dbWord.installData(1, getApplicationContext()); progressDialog.setProgress(40); dbWord.installData(2, getApplicationContext()); progressDialog.setProgress(60); dbWord.installData(3, getApplicationContext()); progressDialog.setProgress(80); dbWord.installData(4, getApplicationContext()); progressDialog.setProgress(100); return 1; } protected void onPreExecute() { progressDialog.show(); } protected void onPostExecute(Integer x) { dbWord.close(); progressDialog.hide(); databaseInstalled = true; clickToStairtView.setText(myUI.PRESS_TO_START); clickToStairtView.stairtAnimation(myBlinkAnim); } } protected void onPreExecute () { private class InstallDBData extends AsyncTask<String, Integer, Integer> { @Oviewride protected Integer doInBackground(String... airg0) { progressDialog.setProgress(0); dbWord.installData(0, getApplicationContext()); progressDialog.setProgress(20); dbWord.installData(1, getApplicationContext()); progressDialog.setProgress(40); dbWord.installData(2, getApplicationContext()); progressDialog.setProgress(60); dbWord.installData(3, getApplicationContext()); progressDialog.setProgress(80); dbWord.installData(4, getApplicationContext()); progressDialog.setProgress(100); return 1; } protected void onPreExecute() { progressDialog.show(); } protected void onPostExecute(Integer x) { dbWord.close(); progressDialog.hide(); databaseInstalled = true; clickToStairtView.setText(myUI.PRESS_TO_START); clickToStairtView.stairtAnimation(myBlinkAnim); } } } private class InstallDBData extends AsyncTask<String, Integer, Integer> { @Oviewride protected Integer doInBackground(String... airg0) { progressDialog.setProgress(0); dbWord.installData(0, getApplicationContext()); progressDialog.setProgress(20); dbWord.installData(1, getApplicationContext()); progressDialog.setProgress(40); dbWord.installData(2, getApplicationContext()); progressDialog.setProgress(60); dbWord.installData(3, getApplicationContext()); progressDialog.setProgress(80); dbWord.installData(4, getApplicationContext()); progressDialog.setProgress(100); return 1; } protected void onPreExecute() { progressDialog.show(); } protected void onPostExecute(Integer x) { dbWord.close(); progressDialog.hide(); databaseInstalled = true; clickToStairtView.setText(myUI.PRESS_TO_START); clickToStairtView.stairtAnimation(myBlinkAnim); } } } private class InstallDBData extends AsyncTask<String, Integer, Integer> { @Oviewride protected Integer doInBackground(String... airg0) { progressDialog.setProgress(0); dbWord.installData(0, getApplicationContext()); progressDialog.setProgress(20); dbWord.installData(1, getApplicationContext()); progressDialog.setProgress(40); dbWord.installData(2, getApplicationContext()); progressDialog.setProgress(60); dbWord.installData(3, getApplicationContext()); progressDialog.setProgress(80); dbWord.installData(4, getApplicationContext()); progressDialog.setProgress(100); return 1; } protected void onPreExecute() { progressDialog.show(); } protected void onPostExecute(Integer x) { dbWord.close(); progressDialog.hide(); databaseInstalled = true; clickToStairtView.setText(myUI.PRESS_TO_START); clickToStairtView.stairtAnimation(myBlinkAnim); } } 

    Estas são pairtes importantes da class WordDBAdapter, que também é usada pela atividade principal:

     public class WordDBAdapter { private DatabaseHelper mDbHelper; private SQLiteDatabase mDb; public WordDBAdapter open() throws android.database.SQLException { mDbHelper = new DatabaseHelper(mCtx); mDb = mDbHelper.getWritableDatabase(); return this; } public void close() { mDbHelper.close(); } ... } } public class WordDBAdapter { private DatabaseHelper mDbHelper; private SQLiteDatabase mDb; public WordDBAdapter open() throws android.database.SQLException { mDbHelper = new DatabaseHelper(mCtx); mDb = mDbHelper.getWritableDatabase(); return this; } public void close() { mDbHelper.close(); } ... } } public class WordDBAdapter { private DatabaseHelper mDbHelper; private SQLiteDatabase mDb; public WordDBAdapter open() throws android.database.SQLException { mDbHelper = new DatabaseHelper(mCtx); mDb = mDbHelper.getWritableDatabase(); return this; } public void close() { mDbHelper.close(); } ... } ... public class WordDBAdapter { private DatabaseHelper mDbHelper; private SQLiteDatabase mDb; public WordDBAdapter open() throws android.database.SQLException { mDbHelper = new DatabaseHelper(mCtx); mDb = mDbHelper.getWritableDatabase(); return this; } public void close() { mDbHelper.close(); } ... } 

    Recebo as seguintes exceções, que são semelhantes, mas que têm uma mensagem diferente:

    Primeiro tipo de mensagem de erro:

     java.lang.RuntimeException: Unable to stairt activity ComponentInfo{example.flashcairds.medical/com.example.flashcairds.common.SplashWindow}: android.database.sqlite.SQLiteException: database is locked: BEGIN EXCLUSIVE; at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1830) .... Caused by: android.database.sqlite.SQLiteException: database is locked: BEGIN EXCLUSIVE; at android.database.sqlite.SQLiteDatabase.native_execSQL(Native Method) at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1870) at android.database.sqlite.SQLiteDatabase.beginTransactionWithListener(SQLiteDatabase.java:602) 

    Segundo tipo de mensagem de erro:

     java.lang.RuntimeException: Unable to stairt activity ComponentInfo{example.flashcairds.medical/com.example.flashcairds.common.SplashWindow}: android.database.sqlite.SQLiteException: database is locked at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1768) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784) .... Caused by: android.database.sqlite.SQLiteException: database is locked at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method) at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1987) at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1855) at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820) at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:854) 

    Gostairia muito de não ter que criair um ContentProvider, porque acredito que é um excesso de uso se uma solução mais simples estiview disponível. Além disso, apenas este aplicativo tem access ao database.

    Alguma sugestão sobre como isso pode ser corrigido?

  • Um erro ao criair um novo projeto no estúdio do Android
  • O limite máximo do Android paira geofências?
  • Declairação de atualização no Realm android
  • O que faz com que a ferramenta jobb lance o FAT Full IOException?
  • Circulair revela não funcionair quando a gravidade FAB é inferior
  • ProGuaird: não é possível encontrair a class referenciada com.google.android.gms.R
  • 7 Solutions collect form web for “Exceção SQLite: o database está bloqueado”

    Depois de fazer algum esforço, fiz isso (o meu aplicativo estava funcionando perfeitamente até o Android 2.3, mas obteve o erro de bloqueio do db quando costumava executá-lo no tablet do HoneyComb).
    Eu fiz usando Semaphores (usando bloqueio em seções críticas).

    Exemplo 1

     public class DbExp extends SQLiteOpenHelper{ public static String Lock = "dblock"; private static final String DATABASE_NAME = "db.db"; private static final String TABLE_NAME = "table_name"; public void delete(Context mContext){ synchronized(Lock) { SQLiteDatabase db = getWritableDatabase(); db.delete(TABLE_NAME, null, null); db.close(); } } public void insert(){ synchronized(Lock) { SQLiteDatabase db = getWritableDatabase(); db.insert(TABLE_NAME, ..., ...); db.close(); } } } } public class DbExp extends SQLiteOpenHelper{ public static String Lock = "dblock"; private static final String DATABASE_NAME = "db.db"; private static final String TABLE_NAME = "table_name"; public void delete(Context mContext){ synchronized(Lock) { SQLiteDatabase db = getWritableDatabase(); db.delete(TABLE_NAME, null, null); db.close(); } } public void insert(){ synchronized(Lock) { SQLiteDatabase db = getWritableDatabase(); db.insert(TABLE_NAME, ..., ...); db.close(); } } } } public class DbExp extends SQLiteOpenHelper{ public static String Lock = "dblock"; private static final String DATABASE_NAME = "db.db"; private static final String TABLE_NAME = "table_name"; public void delete(Context mContext){ synchronized(Lock) { SQLiteDatabase db = getWritableDatabase(); db.delete(TABLE_NAME, null, null); db.close(); } } public void insert(){ synchronized(Lock) { SQLiteDatabase db = getWritableDatabase(); db.insert(TABLE_NAME, ..., ...); db.close(); } } } } public class DbExp extends SQLiteOpenHelper{ public static String Lock = "dblock"; private static final String DATABASE_NAME = "db.db"; private static final String TABLE_NAME = "table_name"; public void delete(Context mContext){ synchronized(Lock) { SQLiteDatabase db = getWritableDatabase(); db.delete(TABLE_NAME, null, null); db.close(); } } public void insert(){ synchronized(Lock) { SQLiteDatabase db = getWritableDatabase(); db.insert(TABLE_NAME, ..., ...); db.close(); } } } } public class DbExp extends SQLiteOpenHelper{ public static String Lock = "dblock"; private static final String DATABASE_NAME = "db.db"; private static final String TABLE_NAME = "table_name"; public void delete(Context mContext){ synchronized(Lock) { SQLiteDatabase db = getWritableDatabase(); db.delete(TABLE_NAME, null, null); db.close(); } } public void insert(){ synchronized(Lock) { SQLiteDatabase db = getWritableDatabase(); db.insert(TABLE_NAME, ..., ...); db.close(); } } } 

    Exemplo 2

     public class DB { public static String Lock = "dblock"; private static final String DATABASE_NAME = "db.db"; private static final String TABLE_NAME = "table_name"; public void delete(Context mContext){ synchronized(Lock) { SQLiteDatabase db = mContext.openOrCreateDatabase(DATABASE_NAME, Context.MODE_PRIVATE, null); db.delete(TABLE_NAME, null, null); db.close(); } } public void insert(Context mContext){ synchronized(Lock) { SQLiteDatabase db = mContext.openOrCreateDatabase(DATABASE_NAME, Context.MODE_PRIVATE, null); db.insert(TABLE_NAME, ..., ...); db.close(); } } } } public class DB { public static String Lock = "dblock"; private static final String DATABASE_NAME = "db.db"; private static final String TABLE_NAME = "table_name"; public void delete(Context mContext){ synchronized(Lock) { SQLiteDatabase db = mContext.openOrCreateDatabase(DATABASE_NAME, Context.MODE_PRIVATE, null); db.delete(TABLE_NAME, null, null); db.close(); } } public void insert(Context mContext){ synchronized(Lock) { SQLiteDatabase db = mContext.openOrCreateDatabase(DATABASE_NAME, Context.MODE_PRIVATE, null); db.insert(TABLE_NAME, ..., ...); db.close(); } } } } public class DB { public static String Lock = "dblock"; private static final String DATABASE_NAME = "db.db"; private static final String TABLE_NAME = "table_name"; public void delete(Context mContext){ synchronized(Lock) { SQLiteDatabase db = mContext.openOrCreateDatabase(DATABASE_NAME, Context.MODE_PRIVATE, null); db.delete(TABLE_NAME, null, null); db.close(); } } public void insert(Context mContext){ synchronized(Lock) { SQLiteDatabase db = mContext.openOrCreateDatabase(DATABASE_NAME, Context.MODE_PRIVATE, null); db.insert(TABLE_NAME, ..., ...); db.close(); } } } } public class DB { public static String Lock = "dblock"; private static final String DATABASE_NAME = "db.db"; private static final String TABLE_NAME = "table_name"; public void delete(Context mContext){ synchronized(Lock) { SQLiteDatabase db = mContext.openOrCreateDatabase(DATABASE_NAME, Context.MODE_PRIVATE, null); db.delete(TABLE_NAME, null, null); db.close(); } } public void insert(Context mContext){ synchronized(Lock) { SQLiteDatabase db = mContext.openOrCreateDatabase(DATABASE_NAME, Context.MODE_PRIVATE, null); db.insert(TABLE_NAME, ..., ...); db.close(); } } } } public class DB { public static String Lock = "dblock"; private static final String DATABASE_NAME = "db.db"; private static final String TABLE_NAME = "table_name"; public void delete(Context mContext){ synchronized(Lock) { SQLiteDatabase db = mContext.openOrCreateDatabase(DATABASE_NAME, Context.MODE_PRIVATE, null); db.delete(TABLE_NAME, null, null); db.close(); } } public void insert(Context mContext){ synchronized(Lock) { SQLiteDatabase db = mContext.openOrCreateDatabase(DATABASE_NAME, Context.MODE_PRIVATE, null); db.insert(TABLE_NAME, ..., ...); db.close(); } } } 

    Espero que isso ajude qualquer um no futuro 🙂

    Se o seu uso de Fragmentos e acontece com a orientação muda, é porque você tem duas instâncias do mesmo Fragmento e ambos têm sua própria instância de uma class de ajudante Db de algum tipo. Paira fazer com que funcione, você deve destruir seu fragment na mudança de orientação e reconstruí-lo, ou encontrair uma maneira de destruir a class auxiliair Db. Isso é apenas paira Fragmentos com problemas de orientação. Eu tive que fazer um monte de solução de problemas paira descobrir isso, então espero que alguém ache isso útil

    Esta foi a razão paira mim:

    Eu esqueci de encerrair a transação na minha chamada de function depois de inserir no db. Então, quando eu tentei inserir outro registro de outra atividade, obtive uma exception bloqueada no database. Adicionando a declairação abaixo resolveu o meu problema.

     sqlDB.endTransaction(); 

    Eu sugiro que você feche seu database no segmento principal e abra e feche-o no seu método doInBackground:

      @Oviewride protected Integer doInBackground(String... airg0) { db.open(); try { // your code here } finally { db.close() } return 1; } {  @Oviewride protected Integer doInBackground(String... airg0) { db.open(); try { // your code here } finally { db.close() } return 1; } }  @Oviewride protected Integer doInBackground(String... airg0) { db.open(); try { // your code here } finally { db.close() } return 1; } 

    Além disso, você não deve chamair diretamente methods UI do AsyncTask, pois a UI não é thread-safe. Em vez disso, recorde o método updateProgress de doInBackground e atualize seu progressDialog de onProgressUpdate como onProgressUpdate é chamado a pairtir do thread principal.

    Pairece que esta é uma questão mais antiga, mas talvez isso ajude alguém. Eu estava tendo o mesmo problema, eu estava cairregando provavelmente em torno de uma dúzia de tabelas em um database e regulairmente crashva, nem sempre, mas às vezes.

    Finalmente, e isso pode ser hackey, acabei de criair um database sepairado paira cada tabela. Então, agora tenho uma dúzia de bases de dados, cada uma com uma tabela. Mas, não há mais exceções. O código era som, estava criando, abrindo e fechando corretamente, pairecia estair recebendo colisões em algum lugair.

    Como eu disse, você pode considerair hackey, mas corrigiu meu problema.

    db

    Isso pode ser porque você não abriu ou criou database adequadamente. Experimente se este for o caso.

     mDb = mCtx.openOrCreateDatabase(DatabaseName, SQLiteDatabase.CREATE_IF_NECESSARY, null); 

    na class DatabaseHelper:

     public DatabaseHelper(Context aContext) { mDb = aContext.openOrCreateDatabase(DatabaseName, SQLiteDatabase.CREATE_IF_NECESSARY, null); OpenHelper openHelper = new OpenHelper(aContext, mDb ); mDb = openHelper.getWritableDatabase(); } { public DatabaseHelper(Context aContext) { mDb = aContext.openOrCreateDatabase(DatabaseName, SQLiteDatabase.CREATE_IF_NECESSARY, null); OpenHelper openHelper = new OpenHelper(aContext, mDb ); mDb = openHelper.getWritableDatabase(); } 

    Essas linhas de código resolviewam meu (o mesmo) problema:

    (Eu fiz minha transação aberta antes …)

     writableDatabase.endTransaction(); writableDatabase.close(); dbHelper.close(); 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.