【问题标题】:Room cannot verify the data integrity, versionnumber already changedRoom 无法验证数据完整性,版本号已更改
【发布时间】:2021-08-07 01:52:06
【问题描述】:

我很沮丧。我正在寻找几个小时的解决方案....

我有一个简单的房间数据库:

@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;
    }
}

当我尝试创建/加载数据库时,我总是收到上述错误。 我已经尝试过的事情:

  • 更改version=1 to version=2
  • exportSchema 更改为false
  • 删除应用并重新安装
  • 正在尝试fallbackToDestructiveMigration()
  • 在我的 SQLLite 浏览器中更改版本号
  • 提到的尝试解决方案here

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

【问题讨论】:

    标签: android sqlite android-room database-migration indices


    【解决方案1】:

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

    这是第一个 Room 检测到它无法验证数据完整性,因为导入的数据库中不存在 room_master_table 表。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-27
      • 2017-11-16
      • 2020-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-15
      相关资源
      最近更新 更多