即使卸载应用程序然后重新安装,Room 也无法验证数据完整性

Sad*_*dat 6 android data-integrity android-room

我已向现有数据库添加了一些新实体(表)。因此在数据库配置中配置了这些-

@Database(entities = {existingTable1.class, existingTable2.class, existingTable3.class, existingTable4.class,
        newTable1.class, newTable2.class
        }, version = 1, exportSchema = false)
Run Code Online (Sandbox Code Playgroud)

由于该应用程序处于开发阶段,我用来避免迁移。因此,我已从设备中卸载该应用程序并通过 Android Studio(运行)进行安装。但它给出了以下错误-

Room 无法验证数据完整性。您似乎已更改架构但忘记更新版本号。您可以通过增加版本号来简单地解决此问题。

在我的清单中,allowBackup 设置为 false,如下所示-

android:allowBackup="false"
Run Code Online (Sandbox Code Playgroud)

编辑

我有一件事要提。我在 asset 文件夹中有一个 sqlite 数据库文件。我只是在安装时将其复制到相应的应用程序数据库文件夹中。因此,当需要添加包含大量预填充数据的新表时,我只需更新 asset 文件夹中的 sqlite 数据库文件,然后调整相关实体并构建/运行项目。这样,它工作得很好,但这次却产生了这个问题。

小智 0

当您更改 Room 数据库结构时,您应该创建一种方法来更新现有数据库。如果第一个结构是版本 1,那么第二个结构应该是版本 2。但是 Room 需要一种方法将现有数据库更新为新结构。您应该创建一个迁移函数。

static RoomDatabase getDatabase(final Context context) {
    if (INSTANCE == null) {
        synchronized (RoomDatabase.class) {
            if (INSTANCE == null) {
                INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                        RoomDatabase.class, "your_database")
                        .addMigrations(MIGRATION_1_2)
                        .build();                
            }
        }
    }
    return INSTANCE;
}

private static final Migration MIGRATION_1_2 = new Migration(1, 2) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        database.execSQL("CREATE TABLE IF NOT EXISTS new_table...
    }
};
Run Code Online (Sandbox Code Playgroud)

如果您只想从头开始而不更新当前数据库,那么您可以删除它以强制创建数据库。

    static RoomDatabase getDatabase(final Context context) {
    if (INSTANCE == null) {
        synchronized (RoomDatabase.class) {
            if (INSTANCE == null) {
                // do not forget to remove this line if it is not needed 
                context.getApplicationContext().deleteDatabase("your_database");
                // Create database here 
                INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                        RoomDatabase.class, "your_database")...
                ... 
Run Code Online (Sandbox Code Playgroud)