房间无法验证数据完整性,版本号已更改

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 数据库时,我总是收到上述错误。 我已经尝试过的事情:

None 的解决方案解决了我的问题,我越来越绝望了。我错过了一些重要的步骤吗?

我认为您的问题是您正在从资产中导入数据库,并且在导入的数据库中版本号已设置为 1。

首先是 Room 检测到它无法验证数据完整性,因为导入的数据库中不存在 room_master_table table。

  • 否则 Room 将根据 APK 中的值检查存储在数据库中的哈希值,如果它们不相同,则架构已更改。

然后 Room 发现数据库的版本号为 1(存储在数据库文件的 header 中),因此表示版本号已更改。 这是真正的问题,而不是无法验证数据完整性。

我认为您需要将正在导入的数据库中的版本号更改为 0。那就是在 DBBeaver 中打开它,单击 Edit Pragmas 并将版本号从 1 更改为 0。例如:-