Room 数据库迁移采坑记

a、采坑之新增表:

1、假设在表UserModel 实体里有一个int字段 id 是主键自增的,在migrate()方法中执行建表SQL语句时,id需要指定 NOT NULL,否则会报异常:java.lang.IllegalStateException: Migration didn't properly handle UserModel 。

2、新建表UserModel 实体时,可以含有boolean类型的字段,但是在migrate()方法中执行建表SQL语句时,该字段不能为BOOLEAN类型的,需要用 INTEGER 替换,且需要加上 NOT NULL,如果不指定默认值,则系统默认为1也就是true。

3、新建表时,在migrate()方法中执行建表SQL语句时,不需要为字段加上默认值即:DEFAULT XXX

b、采坑之新增表字段:

1、假设新增ctTime 字段的类型是int 或 long,在表UserModel 实体里, , 则在migrate()方法中执行SQL语句的时候ctTime 声明需为 INTEGER 类型,并且要加上 NOT NULL DEFAULT 0 ,如:"ALTER TABLE UserModel ADD COLUMN ctTime INTEGER NOT NULL DEFAULT 0" ,
   如果不加 NOT NULL  则会报这个异常:java.lang.IllegalStateException: Migration didn't properly handle UserModel ,因为Room会默认根据你的数据实体UserModel来创建该字段的notNull=true,所以必须加上。
   如果不加 DEFAULT 0 则会报这个异常:android.database.sqlite.SQLiteException: Cannot add a NOT NULL column with default value NULL (code 1):

2、在migrate()方法中执行SQL语句新增某字段时,该字段不能为BOOLEAN类型的,需要用 INTEGER 替换,如果不指定默认值,则系统默认为1也就是true,但是在写表UserModel 实体时,时可以定义Boolean类型的变量的,Room会自己转化为INTEGER。

3、新增某字段类型为 String 时,在migrate()方法中执行SQL语句,该字段用 TEXT 类型进行声明;

 

综合上述情况(a和b):创建Entity实体时,把类型为 int 或 long 或 boolean 的字段用 Integer 去声明,在SQL语句声明时,每个integer字段就 不用加上 NOT NULL,这样创建的表的 Integer 类型的字段,默认值为 NULL,如:database.execSQL("CREATE TABLE IF NOT EXISTS 'UserModel ' ('id' INTEGER NOT NULL PRIMARY KEY autoincrement, 'uid' INTEGER, 'name' TEXT, 'age' INTEGER, 'isMarry' INTEGER)");

另外还有2个注解需要注意如下:

注解 @Ignore         代表字段不会映射到表的 Columns中;
           注解 @Embedded  代表创建嵌套表对象;

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,关于Android中使用Room数据库迁移(Migration)的问题,我可以给你一些简单的解释和示例。 在Android中,Room是一个SQLite数据库对象映射库,它提供了一种简单的方法来处理SQLite数据库。当你需要修改数据库结构时,你需要使用Room数据库迁移(Migration)来保持数据的完整性。 下面是一个简单的Room数据库迁移(Migration)的示例: 首先,定义一个新的实体类,例如: ``` @Entity(tableName = "users") public class User { @PrimaryKey public int id; @ColumnInfo(name = "user_name") public String name; public String email; } ``` 然后,在你的数据库类中,添加一个新的版本和对应的迁移代码,例如: ``` @Database(entities = {User.class}, version = 2) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); // Add migration code here static final Migration MIGRATION_1_2 = new Migration(1, 2) { @Override public void migrate(@NonNull SupportSQLiteDatabase database) { database.execSQL("ALTER TABLE users ADD COLUMN last_name TEXT"); } }; } ``` 在上面的代码中,我们定义了一个新的版本2,并添加了一个新的实体类User,同时定义了一个名为MIGRATION_1_2的迁移对象。迁移对象中重写了migrate()方法,在该方法中执行了数据库的修改操作,例如添加了一个新的last_name列。 最后,在你的应用程序中,使用以下代码创建或打开数据库: ``` AppDatabase db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "database-name") .addMigrations(AppDatabase.MIGRATION_1_2) .build(); ``` 在上面的代码中,我们使用addMigrations()方法将MIGRATION_1_2迁移对象添加到数据库的创建中。 通过以上步骤,你就可以使用Room数据库迁移(Migration)来修改数据库结构,同时保持数据的完整性。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值