网站流程,公众号做 视频网站,扬中论坛全部帖子,电信宽带360元一年一、介绍 Android Room 是 Android 官方提供的一个轻量级数据库框架#xff0c;用于在 Android 应用程序中管理数据持久性。它简化了数据库访问#xff0c;提供了更安全、更快速的数据存储方式#xff0c;并使得数据操作更加便捷。
二、Room的特点(八股文可以参考)
以下是…一、介绍 Android Room 是 Android 官方提供的一个轻量级数据库框架用于在 Android 应用程序中管理数据持久性。它简化了数据库访问提供了更安全、更快速的数据存储方式并使得数据操作更加便捷。
二、Room的特点(八股文可以参考)
以下是关于 Android Room 数据库的一些关键点
数据持久性Room 框架使您能够轻松地将数据持久化到数据库中从而在应用程序的生命周期内保持数据的可用性。SQL 查询简化使用 Room您可以使用标准的 SQL 查询语言来查询数据库同时避免了直接编写 SQL 代码的需要。事务管理Room 自动处理事务确保数据的一致性和完整性。缓存和同步Room 支持将数据缓存在内存中并在需要时同步到数据库。生命周期感知Room 的生命周期感知特性意味着它只在应用程序处于活动状态时执行数据库操作从而优化了性能。数据库迁移随着应用程序的发展和更新您可能需要更改数据库模式。Room 提供了简便的迁移策略来处理模式更改。事务回滚当遇到问题时Room 会自动回滚事务确保数据的完整性。支持多种数据类型Room 支持各种数据类型如整型、浮点型、字符串等。事务隔离级别根据需要设置事务的隔离级别以控制并发操作时的数据一致性。与其他 SQLite 工具兼容由于 Room 在内部使用 SQLite因此它与所有标准的 SQLite 工具和库兼容。
三、数据库升级问题
Room数据库是通过Entity来关联表。一个实体就是一张表如果实体发生变化了表结构自然发生了变化。如果我们不对数据库进行升级通过sql事务提交修改那么这张表在后期会和历史表发生冲突这是开发者最头疼的问题那么如果处理这个问题
处理升级问题我们应该了解Room是通过什么来管理的。
1.库的管理
数据库管理其实是数据库的创建是通过Database里面最核心的就是version。如果第一次创建设置一个版本号。
这个版本号会记录当前表的信息如果表发生了变化在初始化表的时候并没有通过升级版本修改表结构就会导致在Dao执行事务的时候报错。 2.如何修改表结构
在修改表结构Room也提供了合并的支持。分为两种
第一种2.4.0之前的版本手动
通过数据库创建的时候新增Migration
Room.databaseBuilder(context,MyDataBase.class,).addMigrations()
将所有版本的表结构修改的版本号对应的Migration都添加进来。 private Migration migration_1_2 new Migration(1, 2) {Overridepublic 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 的静态类并为其添加以下一项或多项注解
DeleteTable 删除表RenameTable重新命名表名DeleteColumn删除列RenameColumn重新命名列
自动提供了上面几种 DeleteColumn(tableName ,columnName )static class AutoMirgation1 implements AutoMigrationSpec{Overridepublic void onPostMigrate(NonNull SupportSQLiteDatabase db) {AutoMigrationSpec.super.onPostMigrate(db);}}
如果需要新增同样也可以在db里面新增通过execSql语句来完成。 三、代码里过多的Migration是否可以删除
不可以即使你表发生了很大的变化你也不能随便删除之前修改的如果删除了会导致之前有很多用户表有升级到最新导致后期升级上来丢了中间的表变化这样早执行Dao的时候直接crash。所以最好的办法是在创建自己的RoomDataBase的时候所有关于变化的都放在数据库类中方便管理 四、总结
通过以上的分析我们详细的明白Room数据的升级或者数据迁移的两种方式手动需要自己手写代码自动也可以手写但是自动需要JDK 11支持。还有就是手动mirgation的时候要保留之前的不能删除否则对之前的版本会造成无法升级的影响