Android Room的学习之数据库升级

Room学习三部曲

Android Room的学习之基本使用
Android Room的学习之关联表
Android Room的学习之数据库升级

Room的数据库升级分为两种:

  1. 清空数据库中的数据(不建议使用)
private static AppDatabase create(final Context context) {
        return Room.databaseBuilder(
                context,
                AppDatabase.class,
                DB_NAME)
                //添加fallbackToDestructiveMigration方法
                .fallbackToDestructiveMigration()
                .build();
  1. 在原有数据的基础上,添加自己想要的数据
 private static AppDatabase create(final Context context) {
        return Room.databaseBuilder(
                context,
                AppDatabase.class,
                DB_NAME)
                 //添加addMigrations方法
                .addMigrations(MIGRATION_1_4)
                .build();
  1. 在原有表的基础上添加新的字段

       
    
    @Database(entities = {Student.class}, version = 2, exportSchema = false)
      public abstract class AppDatabase extends RoomDatabase {
    
      static Migration MIGRATION_1_2 = new Migration(1, 2) {
            @Override
            public void migrate(SupportSQLiteDatabase database) {
                // 为旧表添加新的字段
                database.execSQL("ALTER TABLE Student "
                        + " ADD COLUMN  sex INTEGER NOT NULL DEFAULT 0");
            }
        };
    
      private static AppDatabase create(final Context context) {
        return Room.databaseBuilder(
                context,
                AppDatabase.class,
                DB_NAME)
                 //添加addMigrations方法
                .addMigrations(MIGRATION_1_2)
                .build();
        }
    
  2. 添加新的表

    
     @Database(entities = {Student.class}, version = 4, exportSchema = false)
      public abstract class AppDatabase extends RoomDatabase {
    
      static Migration MIGRATION_1_4= new Migration(1, 4) {
        @Override
        public void migrate(SupportSQLiteDatabase database) {
            // 为旧表添加新的字段
            database.execSQL("ALTER TABLE Student "
                        + " ADD COLUMN  sex INTEGER NOT NULL DEFAULT 0");
            //  添加新的表
            database.execSQL("CREATE TABLE IF NOT EXISTS Book (bookName TEXT, studentId TEXT, bookId PRIMARY KEY )");
    
        }
    };
    
      private static AppDatabase create(final Context context) {
            return Room.databaseBuilder(
                    context,
                    AppDatabase.class,
                    DB_NAME)
                     //添加addMigrations方法
                    .addMigrations(MIGRATION_1_4)
                    .build();
    }
    

遇见的问题:

android Room 升级 java.lang.IllegalStateException: Migration didn't properly handle

这里是升级数据库遇到的,添加新的字段类似

sex INTEGER NOT NULL DEFAULT 0

一定要有默认值


TableInfo{name='Book', columns={studentId=Column{name='studentId', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, bookName=Column{name='bookName', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, bookId=Column{name='bookId', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null'}}, foreignKeys=[], indices=[]}
     Found:
TableInfo{name='Book', columns={studentId=Column{name='studentId', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, bookName=Column{name='bookName', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, bookId=Column{name='bookId', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null'}}, foreignKeys=[], indices=[]}

查看不一样的改成一样的

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值