前言
Android 的主流数据库框架 Room,在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库。在使用数据库,很多情况下需要对数据库进行预填充,此文探究数据的生成以及填充过程。
填充方式
在官方提供的文档中介绍了两种填充方式:从应用资源预填充和从文件系统预填充,本质上都是从已有的数据库文件中,把数据合并到新创建的数据库中,只是预填充在数据库第一次创建的时候执行。
从应用资源预填充
从应用资源预填充 Room 数据库,需要把预封装的数据库文件放置在应用的 assets/ 目录中,从 RoomDataBase.Builder 对象调用 createFromAsset() 方法,然后调用 build().
Room.databaseBuilder(appContext, AppDatabase.class, "Sample.db")
.createFromAsset("database/myapp.db")
.build();
注意:从某个资源预填充时,Room 会验证数据库,以便确保其架构与预封装数据库的架构相匹配。在创建预封装数据库文件时,您应导出数据库的架构以作为参考。
从文件系统预填充
从设置的任意文件读取预封装的数据库文件进行预填充 Room 数据库,在 RoomDatabase.Builder 对象调用 createFromFile() 方法,然后再调用 build().
Room.databaseBuilder(appContext, AppDatabase.class, "Sample.db")
.createFromFile(new File("mypath"))
.build();
注意:createFromFile() 方法是对读取的 File 参数文件进行创建对应的文件的副本,而不是直接打开该文件,因此需要确保对该文件具有读取权限。
为避免不必要的文件权限管理和数据库版本升级问题,个人推荐从应用资源预填充,便于后续数据库升级的数据迁移和预填充数据管理。
生成预填充文件
对 Room 进行预填充,需要架构相匹配的数据库,因此,在创建预填充数据库文件时,因以当前的数据库架构生成预填充文件。
对于开发者,可以直接在项目结构中加入相关测试程序,添加数据库测试入口,在相应处添加数据插入逻辑,如此减少了额外创建相同数据库架构及环境的过程,避免因失误导致数据库架构不一致导致的未知问题。
通过测试程序插入相应数据后,在 Android studio 打开 Device File Explorer 窗体浏览 data/data/${包名}/databases,发现会有三个文件:
第一个文件为,数据库单例中创建的数据库名字,后面两个文件为缓存和日志文件,把三个文件,通过操作:
保存到电脑,此时,三个文件都要保存下来。接着通过 sqlite 相关的的工具浏览下数据是否准确,确认无误后执行 commit 进行提交。执行后,文件就剩下一个所需的db文件。
这里除了可以这样就行生成预填充文件,也可以通过其他方法,可以直接通过 sql 语句创建、可以通过 sqlite 可视化工具进行生成,即使文中所述的方法,commit 也可以在测试程序中执行,方法众多,方便即可。
进行预填充
把生成的db文件放到对应的 assets 目录中,就可通过 createFromAsset 进行数据预填充。
总结
百变不离其宗,相关内容参考官方文档: developer.android.com/training/da…