【发布时间】:2020-05-13 15:03:12
【问题描述】:
场景
我正在尝试使用一些条目预填充 Room 数据库。 api调用的文档很清楚(developer.android docs),我读过一篇很好的博客(Medium article),但我不熟悉实际预打包数据库文件的语法/格式(developmentData.db在下面的例子)。我在搜索过的任何地方都找不到任何文档。
Room
.databaseBuilder(
context.applicationContext,
MyDatabase::class.java,
"my_database")
.fallbackToDestructiveMigration()
.createFromAsset("database/developmentData.db")
.build()
想法
我已按照documentation 导出架构。这是该过程的结果,以供参考。在这种情况下,我只是为了在这里提问而创建一个虚拟对象。
{
"formatVersion": 1,
"database": {
"version": 1,
"identityHash": "0ad43a6714902eedbb90c1f77ab1ffcb",
"entities": [
{
"tableName": "library_table",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`libraryId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL)",
"fields": [
{
"fieldPath": "libraryId",
"columnName": "libraryId",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "title",
"columnName": "title",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "description",
"columnName": "description",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"libraryId"
],
"autoGenerate": true
},
"indices": [],
"foreignKeys": []
}
],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"0ad43a6714902eedbb90c1f77ab1ffcb\")"
]
}
}
这是我的developmentData.db 的当前内容,但验证失败:
CREATE TABLE IF NOT EXISTS `library_table` (
`libraryId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
`title` TEXT NOT NULL,
`description` TEXT NOT NULL
);
INSERT INTO `library_table` (title, description) VALUES ("Library 1", "A whopping amazing library!");
INSERT INTO `library_table` (title, description) VALUES ("Library the Second", "A smashing library indeed!");
INSERT INTO `library_table` (title, description) VALUES ("Thou Third Library", "Quite possibly the most amazing library ever.");
INSERT INTO `library_table` (title, description) VALUES ("Ye Olde Fouthe Librarye", "So many profound thoughts in here.");
这是错误。它没有加密,所以这一定是语法问题。
E/SQLiteLog: (26) file is encrypted or is not a database
问题
在调用createFromAsset() 时引用的.db 文件应该采用什么格式?如果某处有现有文档,我会很高兴提供参考。
【问题讨论】:
-
应该是SQLite数据库,我觉得可能需要Room自己准备的。 “但验证失败”——你能提供详细信息吗?
-
请详细咨询,谢谢。刚刚将其添加到问题中。
-
该错误表明 Room 试图打开的数据库文件本身已损坏。 “这是我的 developmentData.db 的当前内容”——你的意思是从字面上看,
developmentData.db是一个带有该文本的文本文件吗?如果是这样,请尝试使用 SQLite 数据库,而不是 SQL 脚本。例如,在您让 Room 创建一个数据库后,从设备上复制一个数据库(sanscreateFromAsset())。 -
啊...我完全走错了路。我想到了 Spring 可以执行以预填充数据库的 data.sql 之类的东西。你是对的,这解决了问题。我将尝试在下面给出更完整的答案,但 @CommonsWare 应该得到它的功劳。
标签: android android-room