[小白流泪,大佬欣慰] Android Room 预填充冲数据全流程

1,384 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情

引言

Room 是 Google 已经推出了好几年的数据库抽象层框架,( 上家公司还在死守 Green DAO ,果断跑路 🛴 ),来到新公司,有个需求,简单来说,就是需要提前配置一些数据,这些数据在 App 安装的时候就有,然后用户还可以添加同类型的数据到数据库。

这就需要用到 预填充 Room 数据库 , 其实这也说明了使用 Jetpack 的好处之一就是少了 N 多的技术债,新入行的 Android developer 可以将自己的学习精力投入到新的技术上,直接现代化走起!

✈下面开始教程 ✈

1.准备工具

1.sqlitebrowser.svg -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 文件
image.png
  • 将这三个文件 save to 另存为到电脑上,这样我们就得到一个和项目中结构完全一直的数据文件了(废话,当然一样🥁)
image.png

3.导入预填充的数据

  • 比如我需要到入的数据是这样,在Excel中将预填充的数据准备好:
image.png

Tip : 如果使用表格工具,需要表格和数据库表的结构一直,也就是说需要注意下列名,数据类型

  • 然后,另存为 .CSV 格式的文件

image.png

  • 接下来就是将数据从表格中导入到数据库中

1.打开 GUI 工具,将我们刚刚保存的数据库文件拖到工具中,这里以 SQLiteStudio 来说明 2.打开需要导入数据的表,找到图中的导入按键 , 点击

image.png

3.按照图上的一步一步来

image.png

image.png

image.png

4.走到最后一步的时候,点击 Finish , 这时候,我们的数据已经成功导入到数据中了

image.png

4.将数据库文件复制到项目中的 assets 目录下

我这里顺手修改了以下文件名,方便区分,如果项目中还没有 assets 目录,在项目右键,如图直接可以创建

image.png

🥽有条件的,创建一个database文件夹,更规范一点🥽

image.png

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 开始的,也就是说这里没有去处理数据库的迁移问题。当然数据库的迁移又是一个题材去学习了!