android - caracteristicas - investigaciones sobre youtube pdf
HabitaciĆ³n intento de volver a abrir una base de datos ya cerrada (3)
Al usar Room de los componentes de la arquitectura de Android, recibí el siguiente error al intentar acceder a la base de datos utilizando un componente Dagger:
java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: (database path)
Estaba usando la versión 2.11
Dagger y la versión 1.0.0-alpha7
. El error fue reproducible en la versión 1.0.0-alpha5
.
Este error se produjo en cualquier intento de acceder a la base de datos a través de un DAO después de inicializar la base de datos e inyectarla en mi clase.
Se debe a que está intentando modificar el esquema de la base de datos existente sin proporcionarle información de migración. Entonces, básicamente, intenta escribir el nuevo esquema de base de datos en la base de datos existente que no funciona.
Hay dos maneras de evitar esto. Si se encuentra en su entorno de desarrollo, lo que puede hacer es recurrir a una migración destructiva, para hacer esto, el código de creación de su base de datos sería similar al siguiente:
MyDatabase myDatabase = Room.databaseBuilder(context, MyDatabase.class, "my-db")
.fallbackToDestructiveMigration()
.build();
Esto significa que cuando proporcione a la base de datos una entidad actualizada o nueva, hará lo que dice la respuesta de @huw y simplemente eliminará la base de datos de la instalación de la aplicación eliminando todos los datos y le brindará una instalación nueva.
El otro método es utilizar una función de migración. Son bastante largos, así que a menos que alguien quiera que lo escriba aquí, lo dejo por ahora, pero básicamente, la documentación se puede encontrar aquí:
Sala de Documentación de Migración DB.
Básicamente, esto hace que la base de datos ejecute algunos SQL proporcionados por usted mismo para actualizar la base de datos a la nueva versión. De esta manera, puede asegurarse de que ninguno de sus datos se pierda al realizar la migración; o lo menos posible dependiendo de lo que esté haciendo. Este es el método preferido para las aplicaciones de producción, ya que significa que los usuarios no perderán sus datos preexistentes y no obtendrá muchas críticas enojadas / clientes perdidos.
Espero que haga ayuda!
Tuve este tipo de excepción después de una migración no tan exitosa. Siempre verifique dos veces la consulta SQL que usa para una migración. Puede crear una nueva columna con un tipo de datos incorrecto y la descripción de la excepción no será útil.
Una solución a este problema fue eliminar el archivo de base de datos y comenzar de nuevo. Esto no fue un problema ya que solo estaba probando y podía volver a llenar la base de datos utilizando datos en línea.
Para hacerlo, ya sea:
- Información de la aplicación> Almacenamiento> Borrar datos
- Elimine manualmente el archivo en
/data/data/com.app.example/databases/database.db