在使用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();
最后面我正常运行的
调了一天的问题记录一下