当前位置: 首页 > 知识库问答 >
问题:

即使我更改了版本号,Room也无法验证数据的完整性

易祖鹤
2023-03-14

我正在创建我的第一个房间SQLite迁移,我不知道我现在应该做什么,旧数据库中的版本号是2,我正在将其更改为3。当我尝试编译应用程序时,控制台中出现以下错误:

java.lang.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.

我的数据库代码如下所示:

@Database(entities = {Vehicle.class, ShockAbsorver.class, Customer.class, Review.class, BadRatingOption.class}, version = 3)
public abstract class AppDatabase extends RoomDatabase{
private static AppDatabase INSTANCE;

public abstract VehicleDao vehicleDao();
public abstract ShockAbsorverDao absorverDao();
public abstract  CustomerDao customerDao();
public abstract ReviewDao reviewDao();
public abstract  OptionDao optionDao();

static final Migration MIGRATION_2_3 = new Migration(2,3) {
    @Override
    public void migrate(@NonNull SupportSQLiteDatabase database) {

        database.execSQL("PRAGMA foreign_keys=off;");

        // REMOVE COLUMN 'original' FROM Vehicle
        database.beginTransaction();
        database.execSQL("ALTER TABLE vehicle RENAME TO temp_vehicle;");
        database.execSQL("DROP INDEX vehicleRemoteId");
        database.execSQL("CREATE TABLE vehicle(id TEXT NOT NULL PRIMARY KEY,idSuperk INTEGER,idRemote TEXT,model TEXT,year INTEGER,plate TEXT,km INTEGER, FOREIGN KEY(idRemote) REFERENCES review(vehicleId));");
        database.execSQL("CREATE INDEX vehicleRemoteId ON vehicle(idRemote)");
        database.execSQL("INSERT INTO vehicle (id,idRemote,model,year,plate,km) SELECT id,idRemote,model,year,plate,km FROM temp_vehicle;");
        database.execSQL("DROP TABLE temp_vehicle;");
        database.endTransaction();

        // ADD CLOUMN 'id' INTO ShockAbsorver
        database.execSQL("ALTER TABLE shockAbsorver ADD COLUMN id TEXT");

        // CREATE TABLE BadRatingOption
        database.execSQL("CREATE TABLE options (id TEXT NOT NULL PRIMARY KEY,absorverId TEXT,option INTEGER);");
        database.execSQL("CREATE UNIQUE INDEX id ON options(id)");
        database.execSQL("CREATE INDEX absorverId ON options(absorverId)");

        //POPULATE BadRatingOption WITH OPTIONS FROM ShockAbsorver
        Cursor cursor = database.query("SELECT * FROM shockAbsorver");

        ArrayList<String> reviewIds = new ArrayList<>();
        ArrayList<Integer> indexes = new ArrayList<>();
        ArrayList<Integer> options = new ArrayList<>();

        try {
            while (cursor.moveToNext()) {
                reviewIds.add(cursor.getString(cursor.getColumnIndex("reviewId")));
                indexes.add(cursor.getInt(cursor.getColumnIndex("index")));
                options.add(cursor.getInt(cursor.getColumnIndex("option")));

            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            cursor.close();
        }


        for(int i = 0;i<reviewIds.size();i++){
            String absorverId = UUID.randomUUID().toString();
            String optionId = UUID.randomUUID().toString();
            database.execSQL("UPDATE shockAbsorver SET id='"+absorverId+"' WHERE reviewId = '"+reviewIds.get(i)+"' AND `index` = "+String.valueOf(indexes.get(i))+";");
            database.execSQL("INSERT INTO options (id,absorverId,option) VALUES ('"+optionId+"','"+absorverId+"','"+options.get(i)+"');");
        }

        reviewIds = null;
        indexes = null;
        options = null;


        //REMOVE 'option' FROM ShockAbsorver
        database.beginTransaction();
        database.execSQL("ALTER TABLE shockAbsorver RENAME TO temp_shockAbsorver;");
        database.execSQL("CREATE TABLE shockAbsorver(`index` INTEGER NOT NULL,id TEXT,remoteId TEXT,isGood INTEGER,rating INTEGER,isNew INTEGER NOT NULL,isEdited INTEGER NOT NULL,isOriginal INTEGER,observation TEXT,filename TEXT,vehicle TEXT NOT NULL,reviewId TEXT NOT NULL,remoteReviewId TEXT,PRIMARY KEY(reviewId,`index`), FOREIGN KEY(reviewId) REFERENCES review(id));");
        database.execSQL("INSERT INTO shockAbsorver (`index`,remoteId,isGood,rating,isNew,isEdited,isOriginal,observation,filename,vehicle,reviewId,remoteReviewId) SELECT `index`,remoteId,isGood,rating,isNew,isEdited,isOriginal,observation,filename,vehicle,reviewId,remoteReviewId FROM temp_shockAbsorver;");
        database.execSQL("DROP TABLE temp_shockAbsorver;");
        database.endTransaction();


        database.execSQL("PRAGMA foreign_keys=on;");

    }
};

public static AppDatabase getAppDatabase(Context context){
    if(INSTANCE == null){
        INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                AppDatabase.class,
                "shock-absorver-database")
                .allowMainThreadQueries()
                .addMigrations(MIGRATION_2_3)
                .build();
    }
    return INSTANCE;
}

public static void destroyInstance(){
    INSTANCE = null;
}
}

当我在编写迁移代码时,我得到了“迁移没有正确处理”,直到我修复了所有这些,之后我开始得到数据完整性错误。

提前谢了。

共有1个答案

南门焱
2023-03-14

对于生产类型:您需要编写从一个数据库迁移到另一个数据库的代码https://developer.android.com/training/data-storage/room/migrating-db-versions

开发调试版本:尝试卸载应用程序从您的手机。(它将删除旧数据库)。而不是简单地构建并再次运行。

 类似资料:
  • 自那时起,该应用程序处于开发阶段,我使用该应用程序来避免迁移。所以我已经从设备中配置了应用程序,并通过Android Studio安装(运行)。但它的给出跟随错误- Room无法验证数据完整性。看起来您已经更改了架构,但忘记更新版本号。您可以简单地通过增加版本号来解决这个问题。 在我的清单中,allowBackup设置为false,如下所示- 已编辑 我有一件事要提。我在资产文件夹中有一个sqli

  • 各位,我试着用Spring4来学习helloworld的常规教程,所以我使用了一个maven项目,问题是我在java Resources中遇到了一个错误,当我点击标记时,我得到了以下错误:无法将project facet dynamic web module的版本更改为3.0,我尝试将dynamic web module更改为3.0时,他们不允许我这么做,而我得到了一条消息(java 1.6或更新

  • 在交付到生产构建之前,我已经确保了以下几点 增加数据库版本 注释行中有 allowBackup在清单中变为false 创建数据库时有 创建数据库时有 创建数据库时有 应用程序崩溃,出现以下StackTrace。

  • 嗨,我正在尝试访问一个xapth,我已经从开发人员工具中验证了它是正确的。但是在运行时,我是selenium无法定位它,并且获取元素不可见的异常。 My Xptah://div[contains(text(),'Current Status of Python')] 我在这里找不到任何iframe,但在运行时它仍然无法定位元素。

  • 编辑:我已经用一个带有PropertyValueFactory的cellValueFactory创建了和TableView,但是当我更新表示TableView数据的ObservableList时,我的TableView将不会更新。我确信readNctsvorgaenge()创建的新列表已经更新,并且包含了附加项。这是用mvvmfx->moodel view viewmodel实现的 这是FXML文

  • 当我试图更新我的项目JAR以与新版本的neo4j服务器兼容时,我正在使用neo4j 2.1.2服务器我遇到了问题。 这是porm.xml中使用的旧版本配置 这是新的: 但是当我试图编译我的应用程序时,我得到了这样的跟踪跟踪: