使用Room 数据库,进行升级时(增加新的列),报了Room Database Migration doesnt properly handle ALTER TABLE migration 这个错误,记录下解决过程
NOT NULL DEFAULT 0.0
项目在第四步,遇到了问题,我这边增加的字段类型是double
类型,对应的数据类型是REAL
,所以,新增列是,语句是这样的database.execSQL("ALTER TABLE Cart " + " ADD COLUMN price REAL NOT NULL DEFAULT 0.0");
如果增加的列是String
类型的,就不需要写NOT NULL DEFAULT
关键字,语句是database.execSQL("ALTER TABLE Cart " + " ADD COLUMN currency TEXT");
整体升级代码如下:
public class DatabaseHelper {
private final String DB_NAME = "ShopDatabase.db";
private ShopDatabase testUserDatabase;
private DatabaseHelper(){}
public DatabaseHelper(Context context) {
testUserDatabase = Room.databaseBuilder(
context,
ShopDatabase.class,
DB_NAME)
.addMigrations(MIGRATION_1_2, MIGRATION_2_3).build();
}
public ShopDatabase getShopDatabase() {
return testUserDatabase;
}
final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(SupportSQLiteDatabase database) {
//增加一个String类型的currency列
database.execSQL("ALTER TABLE Cart "
+ " ADD COLUMN currency TEXT");
}
};
final Migration MIGRATION_2_3 = new Migration(2, 3) {
@Override
public void migrate(SupportSQLiteDatabase database) {
//增加一个double类型的price列
database.execSQL("ALTER TABLE Cart "
+ " ADD COLUMN price REAL NOT NULL DEFAULT 0.0");
}
};
}
java 基本类型和数据库类型对照
数据库 | java |
---|---|
UNSPECIFIED | 根据类型自动填入 |
INTEGER | integer 、boolean |
TEXT | String |
REAL | float 、 double |
BLOB | 二进制 |