将 Android 房间生成的模式解析为实际的 SQLite 脚本
Parse Android Room Generated Schema to Actual SQLite Script
我想创建一个 .db 文件来预填充我的 Android 房间数据库,但是 database/schema 很大,所以我想找到一种不手动执行的方法。基本上我想做以下事情:
- 为 Room 生成数据库模式(完成!)
- 从架构中生成 SQLite 命令,无需读取架构并复制和粘贴其中找到的所有脚本
- 在某些 SQL 客户端上创建数据库
- 使用默认数据填充数据库并从中生成一个 .db 文件以添加到我的应用程序中以供 Room 使用。
我在第 2 步需要帮助。非常感谢!
使用适当的实体创建实体和@Database。 (你已经做到了)
Compile/make项目CTRL+F9 .
切换到 Android 视图。
查看 Java(生成的)文件夹并打开子文件夹。一个是 @Database class 后缀为 _Impl。打开那个 class 并找到它包含确切 SQL 所需的 createAllTables 方法。请注意,您不需要 room_master_table 也不需要插入 table.
这是一个例子(只是那个Entity/Table):-
- 无需创建 room_master_table 或向其中插入哈希值(这用于验证架构更改)
交替
创建实体、@Database 和一个基本的@Dao(也许只需要查询 table)。
有一个 Activity 查询数据库,然后当应用程序 运行.
时创建它
关闭数据库(不一定需要)。
运行 应用程序
使用设备资源管理器找到数据库文件(data/data//databases 文件夹)。
如果后缀为 -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):-
:-
我想创建一个 .db 文件来预填充我的 Android 房间数据库,但是 database/schema 很大,所以我想找到一种不手动执行的方法。基本上我想做以下事情:
- 为 Room 生成数据库模式(完成!)
- 从架构中生成 SQLite 命令,无需读取架构并复制和粘贴其中找到的所有脚本
- 在某些 SQL 客户端上创建数据库
- 使用默认数据填充数据库并从中生成一个 .db 文件以添加到我的应用程序中以供 Room 使用。
我在第 2 步需要帮助。非常感谢!
使用适当的实体创建实体和@Database。 (你已经做到了)
Compile/make项目CTRL+F9 .
切换到 Android 视图。
查看 Java(生成的)文件夹并打开子文件夹。一个是 @Database class 后缀为 _Impl。打开那个 class 并找到它包含确切 SQL 所需的 createAllTables 方法。请注意,您不需要 room_master_table 也不需要插入 table.
这是一个例子(只是那个Entity/Table):-
- 无需创建 room_master_table 或向其中插入哈希值(这用于验证架构更改)
交替
创建实体、@Database 和一个基本的@Dao(也许只需要查询 table)。
有一个 Activity 查询数据库,然后当应用程序 运行.
时创建它关闭数据库(不一定需要)。
运行 应用程序
使用设备资源管理器找到数据库文件(data/data/
/databases 文件夹)。 如果后缀为 -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):-
:-