Room : Database Migration doesnt properly handle ALTER TABLE migration迁移失败

吕飞翼
2023-12-01

前言

使用Room 数据库,进行升级时(增加新的列),报了Room Database Migration doesnt properly handle ALTER TABLE migration 这个错误,记录下解决过程

解决流程

  1. 确定版本号(VersionCode)是否增加了
  2. 确定数据库版本(version)是否增加了
  3. 如果数据库改变了,迁移是否做了
  4. 如果增加新的列,不是TEXT 类型,如double、float类型等,要加上 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根据类型自动填入
INTEGERinteger 、boolean
TEXTString
REALfloat 、 double
BLOB二进制
 类似资料: