When you first come across this message, you will most likely be working against an unreleased version of the database. If that is the case, most likely you should not increment the database version. Simply clearing app data will move you passed the exception.
If you do not increment the database (recommended):
You should clear the application's app data from Android settings. You might alternatively be able to uninstall the previous app version and then install the new version to get passed the exception. This latter approach does not work under certain conditions (such as when allow backup is enabled)
Since clearing application data always works, I take that route every time.
If you do increment the database version:
You will need to write database migration code to account for any changes to the database schema. See here for information on migration.
Alternative to writing database migration code is to call fallbackToDestructiveMigration
on the Room database builder. This is probably not a good idea. Forgetting to remove this call and then forgetting to upgrade the database will result in data loss.
// Using this fallback is almost certainly a bad idea
Database database = Room.databaseBuilder(context, Database.class, DATABASE_NAME)
.fallbackToDestructiveMigration()
.build();
Again, neither incrementing the database version nor falling back to destructive migration is necessary if the previous database schema is not live in the wild.
android:allowBackup="true" inside AndroidManifest.xml prevents the data from being cleared even after the app is uninstalled.
Add this to your manifest:
android:allowBackup="false"
and reinstall the app.
Note: Make sure you change it back to true later on if you want auto backups.
Another solution:
Check the identityHash of your old json file and the new json file in apps\schema folder.
If the identityHash is different, it will give that error. Find out what you have changed by comparing both json files if you don't want to change anything.
Make sure you have exportSchema = true.
@Database(entities = {MyEntity.class, ...}, version = 2, exportSchema = true)
json schema file:
"formatVersion": 1,
"database": {
"version": 2,
"identityHash": "53cc5ef34d2ebd33c8518d79d27ed012",
"entities": [
{
code:
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.");
}
}
By default Android manifest have android:allowBackup="true"
, Which allow apps to persist their SQLite DB on reinstallation.
Suppose your DATABASE_VERSION
was initially 3 and then you decide to reduce DB version from 3 to 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.
// }
// };
}
You can achieve it like this
Its a good practise to keep DATABASE_VERSION
as constant.
Aniruddh Parihar 's answer gave me a hint and it solved.
Search for a class where you have extended RoomDatabase
. There you will find version like below :
@Database(entities = {YourEntity.class}, version = 1)
just increase the version and problem is solved.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With