前序
在 android 应用开发中,room 是 google 提供的一个轻量级数据库框架,用于简化与 sqlite 的交互。在应用的迭代过程中,数据库的结构不可避免地会发生变化,因此,我们需要为数据库升级、降级以及数据迁移制定一套合适的策略。
本文将介绍 room 数据库升级的几种场景和常见的处理方法,包括手动迁移和自动迁移的策略。
何时需要升级数据库版本号?
以下几种情况会导致数据库结构的变更,因此必须升级数据库版本号,并处理相应的迁移逻辑:
新增或删除表:当我们向数据库中添加或删除一张表时,必须升级版本号,并实现相应的迁移处理逻辑,以确保数据的一致性。
新增、删除或修改字段:当对表中的字段进行操作时,例如新增一个列、删除或重命名列,必须升级数据库版本号,同时处理好字段的迁移或初始化逻辑。
修改索引或约束:如果为某些字段添加索引,或者对字段的约束(如非空、唯一等)进行修改,同样需要升级版本号。
room 数据库迁移策略
room 提供了多种处理数据库迁移的方式,开发者可以根据项目需求选择合适的迁移策略:
1. fallbacktodestructivemigration 删除数据库并重建
如果应用中的数据不重要,或者我们允许用户丢失数据库中的所有数据,可以使用 fallbacktodestructivemigration 方法,该方法会在版本号发生变化时直接删除数据库并重建。
private static appdatabase create(final context context) { return room.databasebuilder( context, appdatabase.class, "appdatabase.db") .fallbacktodestructivemigration() // 自动删除并重建数据库 .build(); }
注意:使用这种方式,所有的旧数据都会被删除,因此适合那些对数据持久性要求不高的场景。
2. addmigrations 自定义迁移逻辑
当需要保留用户数据时,可以通过自定义 migration
来处理数据库结构变更。例如,给 user
表新增一个 testid
字段:
public static final migration migration_2_3 = new migration(2, 3) { @override public void migrate(@nonnull supportsqlitedatabase database) { // 添加新字段并为其设置默认值 database.execsql("alter table user add testid integer default 0 not null"); } };
在数据库的 room
实例构建时,将这个迁移添加到数据库构建器中:
private static appdatabase create(final context context) { return room.databasebuilder( context, appdatabase.class, "appdatabase.db") .addmigrations(migration_2_3) // 自定义的迁移 .build(); }
优点:这种方式可以确保在数据库结构变更时,用户的数据不会丢失,数据迁移可以按照开发者定义的逻辑进行。
3. room 数据库自动迁移
从 room 2.4 版本开始,支持自动迁移功能,能够根据数据库的 schema
文件自动生成迁移逻辑,简化了跨版本的升级工作。在自动迁移中,room 会自动处理字段的增加和删除,开发者只需配置好数据库的 schemalocation
。
步骤一:配置 room.schemalocation
在 app/build.gradle
文件中配置注解处理器的参数,以便在编译时生成数据库的 schema
文件:
android { defaultconfig { javacompileoptions { annotationprocessoroptions { arguments = ["room.schemalocation": "$projectdir/schemas".tostring()] } } } }
编译时会在配置的目录下生成数据库版本号对应的 json 文件 — 主要信息为数据库相关信息、相关表信息,自动升级会根据这些信息生成 migration。升级方式类似于手动升级的方式。
所有的使用的版本号对应的 json 文件都不能缺少,否则对应版本的升级会出问题,若中途进行的数据库的自动化升级迁移,可考虑回退版本,编译成对应的 json 拷贝过来。
app ├── build │ ├── libs │ ├── release │ └── schemas │ └── database.appdatabase.json │ └── 2.json │ └──.json
步骤二:配置自动迁移
room 允许开发者定义跨版本的自动迁移,例如从 version 1
直接升级到 version 4
:
@database( entities = {user.class}, version = 4, automigrations = { @automigration(from = 1, to = 2), @automigration(from = 2, to = 3), @automigration(from = 3, to = 4), @automigration(from = 1, to = 4) } ) public abstract class appdatabase extends roomdatabase { }
注意:在自动迁移中,字段的新增需要设置 defaultvalue
,否则会报错:
@columninfo(defaultvalue = "0") public int testid;
4. room 跨版本升级与降级
room 也支持顺序或跨版本的数据库升级。假设用户下载的是最新版本的应用(版本号为 4),而数据库版本从未升级(还停留在 version 1
),room 会自动依次执行从 version 1
到 version 4
的所有迁移。
如果我们希望加快迁移速度,可以定义一个从 version 1
直接到 version 4
的迁移逻辑,并通过 addmigrations
方法添加:
public static final migration migration_1_4 = new migration(1, 4) { @override public void migrate(@nonnull supportsqlitedatabase database) { // 自定义跨版本迁移逻辑 database.execsql("alter table user add column testid integer ddedaqefault 0 not null"); database.execsql("alter table user add column test integer dedaq 0 not null"); } };
添加迁移到 room
实例:
db = room.databasebuilder(myapplication.getinstance(), appdatabase.class, "appdatabase.db") .addmigrations(migration_1_2, migration_2_3, migration_3_4, migration_1_4) .fallbacktodestructivemigration() // 防止没有匹配到的迁移时崩溃 .build();
通过这种方式,用户可以直接从 version 1
升级到 version 4
,避免了逐个版本的迁移。
总结
在 android 应用的开发中,数据库的升级与迁移是不可避免的工作。room 提供了灵活的数据库迁移机制,可以通过手动定义迁移、自动生成迁移,或在必要时重建数据库。开发者应根据应用的实际需求选择合适的升级方案,以确保用户数据的完整性和系统的稳定性。
- 自动迁移:适用于简单字段的增加、删除等结构变化。
- 自定义迁移:适合复杂的数据库操作,能够灵活应对各种数据库结构调整。
- 重建数据库:适用于数据不重要或者允许丢失数据的场景。
通过合理的迁移策略,确保数据库的稳定升级,是提高应用质量的重要一环。
以上就是android room数据库自动升级与迁移的策略的详细内容,更多关于android room自动升级与迁移的资料请关注代码网其它相关文章!
发表评论