我正在创建我的第一个房间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;
}
}
当我在编写迁移代码时,我得到了“迁移没有正确处理”,直到我修复了所有这些,之后我开始得到数据完整性错误。
提前谢了。
对于生产类型:您需要编写从一个数据库迁移到另一个数据库的代码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中使用的旧版本配置 这是新的: 但是当我试图编译我的应用程序时,我得到了这样的跟踪跟踪: