之前一直都在用传统方式开发APP,最近在开始学习Google推出的Jetpack,确实可以在开发中省不少事,但是不知道是我个人的原因还是什么,总是会遇到一些莫名其妙的BUG,百度、Google都找不到答案,只好上StackOverflow寻求大佬帮助了。(此页面会不定期更新)

Room数据库:

1.在一个数据库中使用多数据表

这个问题可能也是许多刚接触Room数据库的人会遇到的,一般看了Room的例子之后,无非是需要DAO、Database、Bean这三个类,但是Google官方文档并没有给出多数据表的做法,以及@Database::entities的实际作用。 entities 可以接受多个被@Entity注解的类,可以把一个Entity当做一张数据表,这样只要在一个Database里面添加多个Entity再创建相应的DAO类就行了。

如果你使用多个@Database创建同一个数据库来存放多张数据表,此时就会造成冲突,最明显的是在版本控制上。也就是说,如果你使用了两个@Database类(定义为A、B)填入不同Entity而数据库名又是一样的,就会发生冲突。

若将A类中的version改为2而B中的version保持1不变,那么当你要获取数据时,A表正常,B表会提示“你已经修改了数据库结构,此时只要将version增加即可。”,当你去增加B类的version此时A又可能会报错,重复上述内容。但实际上两个类在操作同一个数据库,因此会发生混乱。

文字描述很抽象,下面给出正确的做法:

@Database(entities = {MyItem1.class,MyItem2.class},version = 1, exportSchema = false)
public abstract class MyDatabase extends RoomDatabase {
    public abstract MyItem1DAO getDaoOf1();
    public abstract MyItem2DAO getDaoOf2();
    // Your code here...
}

MyItem1、MyItem2省略,按常规方法创建即可。

2.数据库版本升级/迁移

最容易忽略的就是更改的Bean类而数据库version没有变,会提示:IllegalStateException: Room cannot verify the data integrity. Looks like you’ve changed schema but…

这时候要么把升级策略添加上,要么用fallback migration来重构数据库,但这样会导致数据丢失。

但是如果你没有修改Bean类而是修改了version,那么此时也应该添加Migration来处理,下面是它的格式:

static final Migration MIGRATION_1_2 = new Migration(1, 2) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        // Changes here...
    }
};

在new Migration的参数中就是版本的迁移了,上面是从version1到version2,当然也可以直接从1-3、1-4、4-1之类的,如果像上面所说的情况Bean没有更改,只需要添加空的Migration就行了,如果有更改(修改结构等)就必须利用里面的SupportSQLiteDatabase来执行相应的SQL语句以真正修改数据库。

当然如果你只是想要做测试,结构变更地频繁且无需长期保留数据,那么你可以试试fallbackToDestructiveMigrationOnDowngrade()和fallbackToDestructiveMigration()这两个方法,一个是向上升级一个是向下升级。也就是说即使你要这样清空数据库,也应该增加或减少数据库的version,如果你想再次从1开始,直接用Device File Explorer(View-ToolsWindows)将data/app.package/database里相应文件直接删除即可。

但是这么做APP可能仍有旧缓存,此时可以进到AndroidManifest中为application添加android:allowBackup属性为false以取消缓存。如果添加了这条属性编译时报错提示:其他库也添加了android:allowBackup这个属性,则你需要再在application内加上tools:replace=”android:allowBackup”属性以覆盖。


0 条评论

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注