Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Intente volver a abrir un objeto ya cerrado: SQLiteDatabase:

Estoy intentando suprimir algo de una base de datos entonces inserto un nuevo valor. No sé mucho sobre las bases de datos, así que apreciaría el consejo en cuál va mal aquí.

Sigo recibiendo el siguiente error:

Caused by: java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: 

Se llama desde una tarea asíncrona, funciona bien la primera vez, pero se rompe la segunda vez que se desencadena la tarea.

Aquí están los fragmentos importantes:

  public void removeAndInsert(String configRaw) { SQLiteDatabase sqlite = null; try { sqlite = dbHelper.getWritableDatabase(); removeAndInsert(configRaw, sqlite); ..... finally { if (sqlite != null) { sqlite.close(); } } void removeAndInsert(String configRaw, SQLiteDatabase sqlite) throws SQLException { ContentValues initialValues = new ContentValues(); initialValues.put(DBOpenHelper.CONFIG_CACHE_RAW_DATA, configRaw); sqlite.delete(DBOpenHelper.CONFIG_CACHE_TABLE_NAME, null, null); sqlite.insert(DBOpenHelper.CONFIG_CACHE_TABLE_NAME, null, initialValues); } 

  • Ormlite Android inserciones masivas
  • IllegalArgumentException: columna no válida
  • Cómo ignorar el acento en la consulta SQLite (Android)
  • Cómo probar la actualización de la base de datos sqlite antes de cargar la nueva versión de mi aplicación en la tienda de juegos en android
  • Android: Cómo cargar imagen dinámicamente desde el servidor por su nombre de SQlite
  • Recyclerview + Proveedor de contenido + CursorLoader
  • ¿Por qué INSERTs y UPDATEs son más lentos en Android 4.0?
  • SQLCipher para Android: icudt46l.zip realmente necesario?
  • 3 Solutions collect form web for “Intente volver a abrir un objeto ya cerrado: SQLiteDatabase:”

    Prueba esto.

     public void removeAndInsert(String configRaw) { SQLiteDatabase sqlite = null; try { sqlite = dbHelper.getWritableDatabase(); synchronized(sqlite) { removeAndInsert(configRaw, sqlite); } ..... finally { if (sqlite != null && sqlite.isOpen()) { sqlite.close(); } } void removeAndInsert(String configRaw, SQLiteDatabase sqlite) throws SQLException { ContentValues initialValues = new ContentValues(); initialValues.put(DBOpenHelper.CONFIG_CACHE_RAW_DATA, configRaw); sqlite.delete(DBOpenHelper.CONFIG_CACHE_TABLE_NAME, null, null); sqlite.insert(DBOpenHelper.CONFIG_CACHE_TABLE_NAME, null, initialValues); } 

    Parece que está creando una instancia de SQLiteOpenHelper ( dbHelper ) en algún lugar y obtiene una base de datos de SQL dbHelper ( sqlite ), pero luego cierra la base de datos. Si se trata de la última (o única) referencia de base de datos abierta, la base de datos completa se cerrará cuando llame a sqlite.close() .

    Puede eliminar con seguridad la llamada a sqlite.close() en removeAndInsert() . Cuando su AsyncTask se termina con su trabajo de base de datos, llame a dbHelper.close() para limpiar cualquier referencia de base de datos que dbHelper.close() .

    Intenta reemplazar sqlite.close(); Con dbHelper.close();

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.