房间无法验证数据完整性,版本号已更改
Room cannot verify the data integrity, versionnumber already changed
我很沮丧。我正在寻找几个小时内的解决方案....
我有一个简单的房间数据库:
@Database(entities = {User.class, Driver.class}, version = 1, exportSchema = true)
public abstract class AppDatabase extends RoomDatabase {
private static AppDatabase instance;
static AppDatabase getDatabase(Context context) {
if (instance == null) {
instance = Room.databaseBuilder(context, AppDatabase.class, "mytest.db").createFromAsset("databases/mytest.db") .build();
}
return instance;
}
public abstract UserDao userDao();
}
并且:
@Entity(tableName = "Driver",
indices = {@Index(value = {"driverName"},unique = true), @Index(value = {"drivingLicNum"},unique = true)}
)
public class Driver {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id")
@NotNull
private int id;
@ColumnInfo(name = "firstName")
@NotNull
private String firstName;
@ColumnInfo(name = "lastName")
@NotNull
private String lastName;
@ColumnInfo(name = "driverName")
@NotNull
private String driverName;
//optionale Parameter
@ColumnInfo(name = "birthDate")
@TypeConverters(Converters.class)
private Date birthDate;
@ColumnInfo(name = "drivingLicNum")
private String drivingLicNum;
@ColumnInfo(name = "drivingLicExpDate")
@TypeConverters(Converters.class)
private Date drivingLicExpDate;
@ColumnInfo(name = "gender")
@TypeConverters(Converters.class)
private Gender gender;
@ColumnInfo(name = "issuingAuthority")
private String issuingAuthority;
@ColumnInfo(name = "licCategory")
@TypeConverters(Converters.class)
private ArrayList<LicenceCategory> licCategory;
@ColumnInfo(name = "isActive", defaultValue = "1")
@NotNull
private boolean isActive;
@ColumnInfo(name = "profilePic")
private byte[] profilePic;
public Driver(@NotNull String firstName, @NotNull String lastName, @NotNull String driverName) {
this.firstName = firstName;
this.lastName = lastName;
this.driverName = driverName;
licCategory = new ArrayList<>();
setIsActive(true);
}
}
并且:
@Entity
public class User {
@PrimaryKey(autoGenerate = true)
@ColumnInfo( name="uid")
@NotNull
public int uid;
@ColumnInfo(name = "first_name")
public String firstName;
@ColumnInfo(name = "last_name")
public String lastName;
public User( String firstName, String lastName){//,//int field4){
this.firstName = firstName;
this.lastName = lastName;
}
}
当我尝试 creating/loading 数据库时,我总是收到上述错误。
我已经尝试过的事情:
- 改变
version=1 to version=2
- 将
exportSchema
更改为 false
- 删除应用程序并重新安装
- 正在尝试
fallbackToDestructiveMigration()
- 更改我的 SQLLite 浏览器中的版本号
- 提到了尝试过的解决方案
None 的解决方案解决了我的问题,我越来越绝望了。我错过了一些重要的步骤吗?
我认为您的问题是您正在从资产中导入数据库,并且在导入的数据库中版本号已设置为 1。
首先是 Room 检测到它无法验证数据完整性,因为导入的数据库中不存在 room_master_table table。
- 否则 Room 将根据 APK 中的值检查存储在数据库中的哈希值,如果它们不相同,则架构已更改。
然后 Room 发现数据库的版本号为 1(存储在数据库文件的 header 中),因此表示版本号已更改。 这是真正的问题,而不是无法验证数据完整性。
我认为您需要将正在导入的数据库中的版本号更改为 0。那就是在 DBBeaver 中打开它,单击 Edit Pragmas 并将版本号从 1 更改为 0。例如:-
我很沮丧。我正在寻找几个小时内的解决方案....
我有一个简单的房间数据库:
@Database(entities = {User.class, Driver.class}, version = 1, exportSchema = true)
public abstract class AppDatabase extends RoomDatabase {
private static AppDatabase instance;
static AppDatabase getDatabase(Context context) {
if (instance == null) {
instance = Room.databaseBuilder(context, AppDatabase.class, "mytest.db").createFromAsset("databases/mytest.db") .build();
}
return instance;
}
public abstract UserDao userDao();
}
并且:
@Entity(tableName = "Driver",
indices = {@Index(value = {"driverName"},unique = true), @Index(value = {"drivingLicNum"},unique = true)}
)
public class Driver {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id")
@NotNull
private int id;
@ColumnInfo(name = "firstName")
@NotNull
private String firstName;
@ColumnInfo(name = "lastName")
@NotNull
private String lastName;
@ColumnInfo(name = "driverName")
@NotNull
private String driverName;
//optionale Parameter
@ColumnInfo(name = "birthDate")
@TypeConverters(Converters.class)
private Date birthDate;
@ColumnInfo(name = "drivingLicNum")
private String drivingLicNum;
@ColumnInfo(name = "drivingLicExpDate")
@TypeConverters(Converters.class)
private Date drivingLicExpDate;
@ColumnInfo(name = "gender")
@TypeConverters(Converters.class)
private Gender gender;
@ColumnInfo(name = "issuingAuthority")
private String issuingAuthority;
@ColumnInfo(name = "licCategory")
@TypeConverters(Converters.class)
private ArrayList<LicenceCategory> licCategory;
@ColumnInfo(name = "isActive", defaultValue = "1")
@NotNull
private boolean isActive;
@ColumnInfo(name = "profilePic")
private byte[] profilePic;
public Driver(@NotNull String firstName, @NotNull String lastName, @NotNull String driverName) {
this.firstName = firstName;
this.lastName = lastName;
this.driverName = driverName;
licCategory = new ArrayList<>();
setIsActive(true);
}
}
并且:
@Entity
public class User {
@PrimaryKey(autoGenerate = true)
@ColumnInfo( name="uid")
@NotNull
public int uid;
@ColumnInfo(name = "first_name")
public String firstName;
@ColumnInfo(name = "last_name")
public String lastName;
public User( String firstName, String lastName){//,//int field4){
this.firstName = firstName;
this.lastName = lastName;
}
}
当我尝试 creating/loading 数据库时,我总是收到上述错误。 我已经尝试过的事情:
- 改变
version=1 to version=2
- 将
exportSchema
更改为false
- 删除应用程序并重新安装
- 正在尝试
fallbackToDestructiveMigration()
- 更改我的 SQLLite 浏览器中的版本号
- 提到了尝试过的解决方案
None 的解决方案解决了我的问题,我越来越绝望了。我错过了一些重要的步骤吗?
我认为您的问题是您正在从资产中导入数据库,并且在导入的数据库中版本号已设置为 1。
首先是 Room 检测到它无法验证数据完整性,因为导入的数据库中不存在 room_master_table table。
- 否则 Room 将根据 APK 中的值检查存储在数据库中的哈希值,如果它们不相同,则架构已更改。
然后 Room 发现数据库的版本号为 1(存储在数据库文件的 header 中),因此表示版本号已更改。 这是真正的问题,而不是无法验证数据完整性。
我认为您需要将正在导入的数据库中的版本号更改为 0。那就是在 DBBeaver 中打开它,单击 Edit Pragmas 并将版本号从 1 更改为 0。例如:-