Android Room数据库更新和预打包数据库

在使用Room的数据库更新过程中,我在@Entity 的实体添加了 2个字段数据,注意:!! 我是在这个实体中间添加的字段,然后就一直报错 java.lang.IllegalStateException: Pre-packaged database has an invalid schema:,找了很久才知道顺序的问题,就添加字段的时候需要放到最后面。

重点来了!!!!

Room.databaseBuilder(context.getApplicationContext(),
        MyDatabase.class, "database-name")
        .addMigrations(MIGRATION_1_2, MIGRATION_2_3)
        .createFromAsset("database/my_prepackaged_db.db")
        .build();

因为需求问题,我这边使用Room数据库是需要预打包数据库使用 RoomDatabase.Builder 的 createFromAsset 或 createFromFile 方法,此时我的对应Room 的 @Database 的version 版本是3,

但是我 预打包数据库的版本是 0,而且里面的对应表的字段也没添加,这里中间有个插曲如果你一开始预打包的数据库创建好后,然后执行数据更新的话,是没问题的

大概流程就是,一开始你的@Database 的version 版本是0,预打包数据库也是0,就会生成Room的数据库出来,然后你接着升级上去MIGRATION_2_3 @Database 的version 版本是3 (最新的),此时肯定,一样没事,照样更新上去,但是我此时卸载重新安装app,你代码是@Database 的version 版本是3,会导致初始化Room预打包数据导致报错 java.lang.IllegalStateException: Pre-packaged database has an invalid schema:,所以代码上面要判断版本
预打包数据库版本要设置对应@Database 的version 版本,而且你添加的对应表的字段也要添加

 private void modifyDatabase() {
        SQLiteDatabase db = null;
        try {
            db = SQLiteDatabase.openDatabase(DATABASE_PATH, null, SQLiteDatabase.OPEN_READWRITE);
            
            // 获取当前版本
            int currentVersion = db.getVersion();
            Log.d(TAG, "Current Database Version: " + currentVersion);

            // 修改版本号
            int newVersion = currentVersion + 1; // 你可以设置为任何你想要的版本号
            db.setVersion(newVersion);
            Log.d(TAG, "Updated Database Version to: " + newVersion);

            // 向表中插入新的 String 字段
            String tableName = "your_table_name"; // 替换为实际的表名
            String newColumnName = "new_column"; // 替换为你想要添加的列名
            
            // SQLite 不支持直接判断列是否存在,通常需要尝试捕捉异常
            try {
                String alterTableQuery = "ALTER TABLE " + tableName + " ADD COLUMN " + newColumnName + " TEXT;";
                db.execSQL(alterTableQuery);
                Log.d(TAG, "Added new column: " + newColumnName);
            } catch (Exception e) {
                Log.e(TAG, "Error adding new column, it might already exist.", e);
            }
        } catch (Exception e) {
            Log.e(TAG, "Error while modifying database", e);
        } finally {
            if (db != null) {
                db.close();
            }
        }
    }

处理好你预打包数据库的db文件以后才能初始化

Room.databaseBuilder(context.getApplicationContext(),
        MyDatabase.class, "database-name")
        .addMigrations(MIGRATION_1_2, MIGRATION_2_3)
        .createFromAsset("database/my_prepackaged_db.db")
        .build();

最后面我正常运行的

调了一天的问题记录一下

在这里插入图片描述

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值