Android 迁移错误:如何迁移索引和类型转换器?

Android 迁移错误:如何迁移索引和类型转换器?,android,sqlite,migration,android-room,indices,Android,Sqlite,Migration,Android Room,Indices,我有一个简单的驱动程序类: @Entity(tableName = "Driver", indices = {@Index(value = {"driverName"},unique = true), @Index(value = {"drivingLicNum"},unique = true)} ) public class Driver { @PrimaryKey(autoGenerate = true) @C

我有一个简单的驱动程序类:

@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);
 }
}
最后但并非最不重要的一点是,我的数据库类中的迁移代码:

@Database(entities = {Driver.class, User.class}, version = 2, exportSchema = false)
@TypeConverters({Converters.class})
public abstract class CarServiceDB  extends RoomDatabase{

private static CarServiceDB instance;

public static CarServiceDB getDatabase(Context context) {
    if (instance == null) {

        Migration migration = new Migration(1, 2) {
            @Override
            public void migrate(@NonNull SupportSQLiteDatabase database) {
                database.execSQL("CREATE TABLE IF NOT EXISTS Driver (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, firstName TEXT NOT NULL, " +
                        "lastName TEXT NOT NULL, driverName TEXT NOT NULL UNIQUE, birthDate NUMERIC, drivingLicNum INTEGER UNIQUE, drivingLicExpDate NUMERIC, " +
                        "gender TEXT CHECK(gender = \"MALE\" or gender = \"FEMALE\" or gender = \"UNKNOWN\"), " +
                        "issuingAuthority TEXT, licCategory TEXT, isActive INTEGER NOT NULL DEFAULT 1 CHECK(isActive IN (0,1)),profilePic BLOB)");
            }
        };

        instance = Room.databaseBuilder(context, CarServiceDB.class, "mycardatabase.db").addMigrations(migration).createFromAsset("databases/mycardatabase.db").build();


    }
    return instance;
}
public abstract UserDao userDao();
}
然而,我得到了一个可能是最烦人的房间异常错误:


我用黄色标记了不匹配的列。正如您所见,日期类型转换器没有正确迁移,即使我说日期具有数据类型
NUMERIC
,并且出于某种原因,房间创建了一个
索引列
,该列不会迁移,即使我添加了
索引
注释my
驱动程序
类。我错过了什么?

迁移可能是。。。。 我尝试了您的代码,发现了以下问题:

Migration migration = new Migration(1, 2) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
  database.execSQL("DROP TABLE IF EXISTS Driver");
  database.execSQL("CREATE TABLE IF NOT EXISTS Driver (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, firstName TEXT NOT NULL, " +
  "lastName TEXT NOT NULL, driverName TEXT UNIQUE NOT NULL , birthDate INTEGER, drivingLicNum TEXT UNIQUE, drivingLicExpDate INTEGER, " +
  "gender TEXT CHECK(gender = \"MALE\" or gender = \"FEMALE\" or gender = \"UNKNOWN\"), issuingAuthority TEXT, licCategory TEXT, isActive INTEGER NOT NULL DEFAULT 1 CHECK(isActive IN (0,1)),profilePic BLOB)");

  database.execSQL("CREATE UNIQUE INDEX index_Driver_drivingLicNum ON  Driver(drivingLicNum)");
  database.execSQL("CREATE UNIQUE INDEX index_Driver_driverName ON  Driver(driverName)");
}
我换了什么

  • 对于每个唯一的列,您需要创建一个唯一的索引
  • 您需要将日期数据类型更改为整数而不是数字,因为SQLLITE需要整数
  • Migration migration = new Migration(1, 2) {
    @Override
    public void migrate(@NonNull SupportSQLiteDatabase database) {
      database.execSQL("DROP TABLE IF EXISTS Driver");
      database.execSQL("CREATE TABLE IF NOT EXISTS Driver (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, firstName TEXT NOT NULL, " +
      "lastName TEXT NOT NULL, driverName TEXT UNIQUE NOT NULL , birthDate INTEGER, drivingLicNum TEXT UNIQUE, drivingLicExpDate INTEGER, " +
      "gender TEXT CHECK(gender = \"MALE\" or gender = \"FEMALE\" or gender = \"UNKNOWN\"), issuingAuthority TEXT, licCategory TEXT, isActive INTEGER NOT NULL DEFAULT 1 CHECK(isActive IN (0,1)),profilePic BLOB)");
    
      database.execSQL("CREATE UNIQUE INDEX index_Driver_drivingLicNum ON  Driver(drivingLicNum)");
      database.execSQL("CREATE UNIQUE INDEX index_Driver_driverName ON  Driver(driverName)");
    }