携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情
引言
Room 是 Google 已经推出了好几年的数据库抽象层框架,( 上家公司还在死守 Green DAO ,果断跑路 🛴 ),来到新公司,有个需求,简单来说,就是需要提前配置一些数据,这些数据在 App 安装的时候就有,然后用户还可以添加同类型的数据到数据库。
这就需要用到 预填充 Room 数据库 , 其实这也说明了使用 Jetpack 的好处之一就是少了 N 多的技术债,新入行的 Android developer 可以将自己的学习精力投入到新的技术上,直接现代化走起!
✈下面开始教程 ✈
1.准备工具
1.
-
DB Browser for SQLite 图形化管理 sqlite 工具,好使!这里下载
或者使用SQLiteStudio 都可以
2.Excel / WPS ,处理预填充的数据,当然也可以直接在前文提到的数据库 GUI 工具中处理
3.本文 Room 环境为最新稳定版 2.4.2
2.生成一个和所需相同结构的数据库
我们使用一个简单的方法,绕过一些繁琐的制作流程
- 来到我们的声明数据的类
AppDatabase.kt,注意这里我们先注释掉createFromAsset(xxx)这行代码
@Database(
entities = [Xxx::class],
exportSchema = false,
version = 1
)
abstract class AppDatabase : RoomDatabase() {
abstract fun xxxDao(): XxxDao
companion object {
@Volatile
private var INSTANCE: AppDatabase? = null
fun getDatabase(context: Context): AppDatabase {
// 使用同步代码块保证只有一个实例
return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java,
"app_db.db"
)
//.createFromAsset("database/appDatabase.db")
.build()
INSTANCE = instance
// return instance
instance
}
}
}
}
- 写一段使用数据库的代码,直接调用最好是写入一条数据到数据库中,随便一个表都行,这样做的目的是让代码生成数据库文件,下一步会用到,例如
fun override onResume(){
...xxx...
lifecycler.launch(Dispatchers.IO) {
AppDatabase
.getDatabase(appContext)
.xxxItemDao()
.insert(item)
}
- 然后让自己的 App 编译运行, 利用
Android Studio的Device File Explorer工具,在data/data/包名中找到生成的.db文件
- 将这三个文件
save to另存为到电脑上,这样我们就得到一个和项目中结构完全一直的数据文件了(废话,当然一样🥁)
3.导入预填充的数据
- 比如我需要到入的数据是这样,在Excel中将预填充的数据准备好:
Tip : 如果使用表格工具,需要表格和数据库表的结构一直,也就是说需要注意下列名,数据类型
- 然后,另存为
.CSV格式的文件
- 接下来就是将数据从表格中导入到数据库中
1.打开 GUI 工具,将我们刚刚保存的数据库文件拖到工具中,这里以 SQLiteStudio 来说明
2.打开需要导入数据的表,找到图中的导入按键 , 点击
3.按照图上的一步一步来
4.走到最后一步的时候,点击 Finish , 这时候,我们的数据已经成功导入到数据中了
4.将数据库文件复制到项目中的 assets 目录下
我这里顺手修改了以下文件名,方便区分,如果项目中还没有 assets 目录,在项目右键,如图直接可以创建
🥽有条件的,创建一个database文件夹,更规范一点🥽
5.最后回到项目中创建 database 的地方AppDatabase.kt,在 build() 调用之前,加上调用 createFromAsset() 参数为 db 文件相对路径 , 至此我们已经完成了整个流程
fun getDatabase(context: Context): AppDatabase {
// 使用同步代码块保证只有一个实例
return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java,
"app_db.db"
)
.createFromAsset("database/appDatabase.db")
.build()
INSTANCE = instance
// return instance
instance
}
结语
本文流程已经是用了最简单的方法导入预填充数据了,同时应该注意到,这是项目的数据库从 version 1 开始的,也就是说这里没有去处理数据库的迁移问题。当然数据库的迁移又是一个题材去学习了!