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

本文详细介绍了在使用Room数据库进行版本升级时遇到的错误“RoomDatabaseMigrationdoesntproperlyhandleALTERTABLEmigration”的解决过程。重点讲解了如何正确地添加新列,包括不同数据类型的处理方式,以及提供了一个完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

使用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二进制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值