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)");
}
我换了什么
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)");
}