将 Android 房间生成的模式解析为实际的 SQLite 脚本

Parse Android Room Generated Schema to Actual SQLite Script

我想创建一个 .db 文件来预填充我的 Android 房间数据库,但是 database/schema 很大,所以我想找到一种不手动执行的方法。基本上我想做以下事情:

  1. 为 Room 生成数据库模式(完成!)
  2. 从架构中生成 SQLite 命令,无需读取架构并复制和粘贴其中找到的所有脚本
  3. 在某些 SQL 客户端上创建数据库
  4. 使用默认数据填充数据库并从中生成一个 .db 文件以添加到我的应用程序中以供 Room 使用。

我在第 2 步需要帮助。非常感谢!

  1. 使用适当的实体创建实体和@Database。 (你已经做到了)

  2. Compile/make项目CTRL+F9 .

  3. 切换到 Android 视图。

  4. 查看 Java(生成的)文件夹并打开子文件夹。一个是 @Database class 后缀为 _Impl。打开那个 class 并找到它包含确切 SQL 所需的 createAllTables 方法。请注意,您不需要 room_master_table 也不需要插入 table.

这是一个例子(只是那个Entity/Table):-

  • 无需创建 room_master_table 或向其中插入哈希值(这用于验证架构更改)

交替

  1. 创建实体、@Database 和一个基本的@Dao(也许只需要查询 table)。

  2. 有一个 Activity 查询数据库,然后当应用程序 运行.

    时创建它
  3. 关闭数据库(不一定需要)。

  4. 运行 应用程序

  5. 使用设备资源管理器找到数据库文件(data/data//databases 文件夹)。

  6. 如果后缀为 -wal 的文件存在且不是 0 字节,则将所有三个文件复制到 suitable 位置。如果没有 -wal(或 0 字节)文件,则只需要复制数据库文件本身(不过复制 -wal 和 -shm 文件也无妨)。

  • 如果-wal 存在并且有属于数据库的数据,那么您必须复制-wal 并确保-shm 文件。关闭数据库应该提交更改,这是一个完整的提交(然后 -wal 文件应该是空的)。
    • 注意创建 tables 等将首先未提交地应用到 -wal 文件。

替代示例

在activity中:-

class MainActivity : AppCompatActivity() {
    lateinit var db: TheDatabase
    lateinit var dao: AllDao
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        db = TheDatabase.getInstance(this)
        dao = db.getAllDao()
        dao.getTodoCount() //<<<<<< query just to open DB and thus create table via onCreate 
        db.close(); //<<<<< Close to commit WAL file
    }
}

@数据库在这种情况下是:-

@Database(entities = [Todo::class],version = 1)
abstract class TheDatabase: RoomDatabase() {
    abstract fun getAllDao(): AllDao

    companion object {
        @Volatile
        private var instance: TheDatabase? = null
        fun getInstance(context: Context): TheDatabase {
            if (instance == null) {
                instance = synchronized(context) {
                    Room.databaseBuilder(context, TheDatabase::class.java, "tot.db")
                        .allowMainThreadQueries() //<<<<<<<<<< allow main thread run
                        .build()
                }
            }
            return instance!!
        }
    }
}
  • 注意 .allowMainThreadQueries() 简化了事情。

应用是 运行。然后数据库检查器用于确认数据库(不需要):-

用于定位数据库的设备文件资源管理器:-

右键单击文件并另存为:-

使用 SQLite 工具打开(本例中为 Navicat):-

:-