android - tesis - Sala no puede verificar la integridad de los datos
tesis sobre youtube pdf (10)
Recibo este error mientras ejecuto el programa con Room Database
Room cannot verify the data integrity. Looks like you''ve changed schema but forgot to update the version number.
You can simply fix this by increasing the version number.
Parece que necesitamos actualizar la versión de la base de datos, pero ¿desde dónde podemos hacerlo en Room?
Compruebe la identidad de su antiguo archivo json y el nuevo archivo json en la carpeta apps / schema.
Si el identityHash es diferente, dará ese error. Averigüe qué ha cambiado comparando ambos archivos json si no desea cambiar nada.
Asegúrate de que tienes exportSchema = true.
@Database(entities = {MyEntity.class, ...}, version = 2, exportSchema = true)
archivo de esquema json:
"formatVersion": 1,
"database": {
"version": 2,
"identityHash": "53cc5ef34d2ebd33c8518d79d27ed012",
"entities": [
{
código:
private void checkIdentity(SupportSQLiteDatabase db) {
String identityHash = null;
if (hasRoomMasterTable(db)) {
Cursor cursor = db.query(new SimpleSQLiteQuery(RoomMasterTable.READ_QUERY));
//noinspection TryFinallyCanBeTryWithResources
try {
if (cursor.moveToFirst()) {
identityHash = cursor.getString(0);
}
} finally {
cursor.close();
}
}
if (!mIdentityHash.equals(identityHash) && !mLegacyHash.equals(identityHash)) {
throw new IllegalStateException("Room cannot verify the data integrity. Looks like"
+ " you''ve changed schema but forgot to update the version number. You can"
+ " simply fix this by increasing the version number.");
}
}
Cuando llegue por primera vez a este mensaje, lo más probable es que trabaje contra una versión inédita de la base de datos. Si ese es el caso, lo más probable es que no deba incrementar la versión de la base de datos . Simplemente borrando los datos de la aplicación se moverá la excepción.
Si no incrementa la base de datos (recomendado):
Debe borrar los datos de la aplicación de la configuración de Android. Como alternativa, puede desinstalar la versión de la aplicación anterior y luego instalar la nueva versión para pasar la excepción. Este último enfoque no funciona bajo ciertas condiciones (como cuando se habilita Permitir copia de seguridad)
Como la limpieza de los datos de la aplicación siempre funciona, tomo esa ruta cada vez.
Si incrementa la versión de la base de datos:
Deberá escribir el código de migración de la base de datos para tener en cuenta los cambios en el esquema de la base de datos. Consulte here para obtener información sobre la migración.
La alternativa a escribir el código de migración de la base de datos es llamar a fallbackToDestructiveMigration
en el generador de la base de datos de Room. Probablemente no sea una buena idea. Si se olvida de eliminar esta llamada y luego se olvida actualizar la base de datos, se perderán los datos.
// Using this fallback is almost certainly a bad idea
Database database = Room.databaseBuilder(context, Database.class, DATABASE_NAME)
.fallbackToDestructiveMigration()
.build();
Nuevamente, no es necesario aumentar la versión de la base de datos ni recurrir a la migración destructiva si el esquema de la base de datos anterior no está vivo.
En mi caso tuve una clase AppDatabase.
@Database(entities = {GenreData.class, MoodData.class, SongInfo.class,
AlbumsInfo.class, UserFolderListsData.class, UserPlaylistResponse.PlayLists.class, InternetConnectionModel.class}, version = 3, exportSchema = false)
Actualicé este número de versión y resolví el problema. El problema surgió porque había agregado una propiedad en la clase SongInfo y olvidé actualizar el número de versión.
Espero que ayude a alguien.
En mi caso, ContentProvider y la base de datos de la sala trabajan juntos, por lo que primero elimine toda la devolución de llamada de ContentProvider en toda la aplicación con la clase de base de datos que extiende la clase SqlLiteOpenHelper
En mi caso, estaba usando una transacción dentro de la migración y Room no pudo actualizar el hash usando un Asistente de migración
@get:Rule
val migrationTestHelper: MigrationTestHelper =
MigrationTestHelper(InstrumentationRegistry.getInstrumentation(),
C2GDatabase::class.java.canonicalName,
FrameworkSQLiteOpenHelperFactory())
/* Testing method throws error*/
db = migrationTestHelper.runMigrationsAndValidate(C2GDatabase.DB_NAME,
3,
false,
C2GDatabase.Migration_1_2(),
C2GDatabase.Migration_2_3())
override fun migrate(database: SupportSQLiteDatabase) {
/**
Error
database.beginTransaction()
**/
database.execSQL("PRAGMA foreign_keys=off;")
database.execSQL("ALTER TABLE user RENAME TO user_old;")
database.execSQL("CREATE TABLE user ( id_user INTEGER PRIMARY KEY AUTOINCREMENT, external_id INTEGER NOT NULL;")
database.execSQL("INSERT INTO user ( id_user, external_id ) " +
" SELECT id_user, external_id" +
" FROM user_old;")
database.execSQL("CREATE UNIQUE INDEX idx_unique_user ON user (external_id);")
database.execSQL("PRAGMA foreign_keys=on;")
database.execSQL("DROP TABLE user_old;")
//database.endTransaction()
}
Es muy simple como se muestra en el registro
Looks like you''ve changed schema but forgot to update the version number.
You can simply fix this by increasing the version number.
Simplemente vaya a su clase de base de datos y actualice su versión de base de datos incrementando 1 desde la actual.
Este problema ocurre principalmente en el desarrollo.
Si cambia su esquema, es decir, renombre / agregue / modifique su clase que contiene entidad de tabla, la integridad entre salir de db en su compilación anterior entra en conflicto con la nueva compilación.
borre los datos de la aplicación o instale una nueva compilación después de desinstalar la compilación anterior .
Ahora, el viejo db no entrará en conflicto con el más nuevo.
La respuesta de Aniruddh Parihar me dio una pista y se resolvió.
Busque una clase en la que haya ampliado RoomDatabase
. Allí encontrarás una versión como la siguiente:
@Database(entities = {YourEntity.class}, version = 1)
Basta con aumentar la versión y el problema está resuelto.
Por defecto, el manifiesto de Android tiene `android: allowBackup =" true ", que permite a las aplicaciones conservar su base de datos SQLite en la reinstalación.
Supongamos que su DATABASE_VERSION
fue inicialmente 3 y luego decide reducir la versión de DB de 3 a 1.
@Database(entities = {CallRecording.class}, version = DATABASE_VERSION)
public abstract class AppDatabase extends RoomDatabase {
public abstract RecordingDAO recordingDAO();
// static final Migration MIGRATION_1_2 = new Migration(1, 2) {
// @Override
// public void migrate(SupportSQLiteDatabase database) {
// // Since we didn''t alter the table, there''s nothing else to do here.
// }
// };
}
Puedes lograrlo así
- Borrar los datos de la aplicación de Configuración. Esto eliminará el DB anterior (DATABASE_VERSION = 3) del teléfono
- Desinstala tu aplicación
- Reducir la versión DATABASE_VERSION a 1
- Construye y reinstala tu aplicación
Es una buena práctica mantener DATABASE_VERSION
como constante.
Si está actualizando la versión de Room a 1.0.0-alpha9 desde la versión anterior, visite el siguiente artículo. Muy buen artículo para migrar de la versión anterior a la versión 1.0.0-alpha9.
In Room New Version 1.0.0-alpha9 Room agrega soporte para la restricción NOT NULL.
Eso va a cambiar el esquema que genera Room. Debido a que cambia el esquema, también cambia el identityHash de la base de datos y que Room utiliza para identificar de forma única cada versión de la base de datos. Por lo tanto, necesitamos una migración.