【发布时间】:2021-02-13 21:21:09
【问题描述】:
我有一个简单的 Driver 类:
@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);
}
}
我的TypeConverter 班级:
public final class Converters {
private static Gson gson = new Gson();
@TypeConverter
public static ArrayList<LicenceCategory> fromStringToLicenceCategories(String value) {
Type listType = new TypeToken<ArrayList<LicenceCategory>>() {}.getType();
return gson.fromJson(value, listType);
}
@TypeConverter
public static String fromLicenceCategoriesToString(ArrayList<LicenceCategory> list) {
return gson.toJson(list);
}
@TypeConverter
public static Gender fromStringToGender(String value) {
Type listType = new TypeToken<Gender>() {}.getType();
return gson.fromJson(value, listType);
}
@TypeConverter
public static String fromGenderToString(Gender gender) {
return gson.toJson(gender);
}
@TypeConverter
public static Date fromTimestampToDate(Long value) {
return value == null ? null : new Date(value);
}
@TypeConverter
public static Long fromDateToTimestamp(Date date) {
return date == null ? null : date.getTime();
}
}
最后但同样重要的是,我的数据库类中的迁移代码:
@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,并且出于某种原因,房间会创建一个indices column,即使我添加了@987654329,它也不会迁移@ 注释我的 Driver 类。我错过了什么?
【问题讨论】:
标签: android sqlite migration android-room indices