Android Room 是 Android 官方提供的一个轻量级数据库框架,用于在 Android 应用程序中管理数据持久性。它简化了数据库访问,提供了更安全、更快速的数据存储方式,并使得数据操作更加便捷。
以下是关于 Android Room 数据库的一些关键点:
Room数据库是通过Entity来关联表。一个实体就是一张表,如果实体发生变化了表结构自然发生了变化。如果我们不对数据库进行升级,通过sql事务提交修改,那么这张表在后期会和历史表发生冲突,这是开发者最头疼的问题,那么如果处理这个问题?
处理升级问题,我们应该了解Room是通过什么来管理的。
数据库管理,其实是数据库的创建,是通过Database,里面最核心的就是version。如果第一次创建,设置一个版本号。
这个版本号会记录当前表的信息,如果表发生了变化,在初始化表的时候,并没有通过升级版本,修改表结构,就会导致在Dao执行事务的时候报错。
在修改表结构,Room也提供了合并的支持。分为两种
通过数据库创建的时候,新增Migration
Room.databaseBuilder(context,MyDataBase.class,"").addMigrations()
将所有版本的表结构修改的版本号,对应的Migration都添加进来。
private Migration migration_1_2 = new Migration(1, 2) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
//一般新增
database.execSQL("ALTER TABLE table_name ADD column_name datatype");
//修改表名或者数据结构
database.execSQL("ALTER TABLE table_name MODIFY COLUMN column_name datatype");
//删除
database.execSQL("ALTER TABLE table_name DROP COLUMN column_name");
}
};
Migration:
需要指定就版本与新版本,然后在创建库的时候会进行坚持。
注意:
在使用Room数据的时候,一定要小心,如果你的数据库发生了变化,一定要及时新增migration,否则时间一长,可能改的面目全非。所以,在新设计表的时候一定要要注意以后的扩展
在2.4.0以后,升级可以通过@DataBase里面的autoMigrations来完成,但是需要Java11支持
public @interface Database {
Class[] entities();
Class[] views() default {};
int version();
*/
boolean exportSchema() default true;
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
Class[] autoMigrations() default {};
}
@Database(autoMigrations = {@AutoMigration(from = 1,to = 2,spec = MyDataBase.AutoMirgation1.class )})
自动版本基本和手动差不多,只是采取kapt,和注入方式,不需要开发者再手写代码,降低了开发难度。
您可以使用 AutoMigrationSpec
为 Room 提供正确生成迁移路径所需的额外信息。定义一个在 RoomDatabase
类中实现 AutoMigrationSpec
的静态类,并为其添加以下一项或多项注解:
自动提供了上面几种:
@DeleteColumn(tableName = "",columnName ="")
static class AutoMirgation1 implements AutoMigrationSpec{
@Override
public void onPostMigrate(@NonNull SupportSQLiteDatabase db) {
AutoMigrationSpec.super.onPostMigrate(db);
}
}
如果需要新增,同样也可以在db里面新增,通过execSql语句来完成。
不可以,即使你表发生了很大的变化,你也不能随便删除之前修改的,如果删除了,会导致之前有很多用户表有升级到最新,导致后期升级上来,丢了中间的表变化,这样早执行Dao的时候,直接crash。所以最好的办法是在创建自己的RoomDataBase的时候,所有关于变化的都放在数据库类中,方便管理
通过以上的分析,我们详细的明白Room数据的升级或者数据迁移的两种方式,手动需要自己手写代码,自动也可以手写,但是自动需要JDK 11支持。还有就是手动mirgation的时候要保留之前的,不能删除,否则对之前的版本会造成无法升级的影响