附加
考虑到评论:-
事实证明,这是因为我使用的是预填充的数据库。
这是一个基于上述答案的示例,但具有合适的预填充数据库。
合适的,是根据 Room 期望创建的,它本身基于实体。
-
注意,由于原始答案用于提供另一个答案,因此数据库包含其他表和索引。
创建一个合适的数据库相对容易,就像你用实体和@Database(指适当的实体)编译项目(CTRL + F9),然后Room生成java(Android View显示了这一点)。与@Database 类名称相同并以_Impl 为后缀的文件有一个名为createAllTables 的方法,该方法可以很容易地在任何SQLite 工具中使用(假设该工具支持FTS)。
创建合适的预填充数据库
- 在 Android Studio 中找到生成的 java 文件 TheDatabase_Impl 和其中的
createAllTables 方法:-
- 使用 SQLite 工具基本上是从生成的 java 复制 SQL,例如
:-
CREATE TABLE IF NOT EXISTS `hymns_table` (`_id` INTEGER, `title` TEXT NOT NULL, `author` TEXT NOT NULL, `lyrics` TEXT NOT NULL, PRIMARY KEY(`_id`));
CREATE VIRTUAL TABLE IF NOT EXISTS `hymns_fts` USING FTS4(`title` TEXT NOT NULL, `lyrics` TEXT NOT NULL, content=`hymns_table`);
CREATE TRIGGER IF NOT EXISTS room_fts_content_sync_hymns_fts_BEFORE_UPDATE BEFORE UPDATE ON `hymns_table` BEGIN DELETE FROM `hymns_fts` WHERE `docid`=OLD.`rowid`; END;
CREATE TRIGGER IF NOT EXISTS room_fts_content_sync_hymns_fts_BEFORE_DELETE BEFORE DELETE ON `hymns_table` BEGIN DELETE FROM `hymns_fts` WHERE `docid`=OLD.`rowid`; END;
CREATE TRIGGER IF NOT EXISTS room_fts_content_sync_hymns_fts_AFTER_UPDATE AFTER UPDATE ON `hymns_table` BEGIN INSERT INTO `hymns_fts`(`docid`, `title`, `lyrics`) VALUES (NEW.`rowid`, NEW.`title`, NEW.`lyrics`); END;
CREATE TRIGGER IF NOT EXISTS room_fts_content_sync_hymns_fts_AFTER_INSERT AFTER INSERT ON `hymns_table` BEGIN INSERT INTO `hymns_fts`(`docid`, `title`, `lyrics`) VALUES (NEW.`rowid`, NEW.`title`, NEW.`lyrics`); END;
CREATE TABLE IF NOT EXISTS `application_table` (`id` INTEGER, `name` TEXT NOT NULL, PRIMARY KEY(`id`));
CREATE UNIQUE INDEX IF NOT EXISTS `index_application_table_name` ON `application_table` (`name`);
CREATE TABLE IF NOT EXISTS `brand_table` (`id` INTEGER, `path` TEXT NOT NULL, `code` TEXT NOT NULL, `value` TEXT NOT NULL, PRIMARY KEY(`id`));
CREATE TABLE IF NOT EXISTS `Model` (`id` INTEGER, `path` TEXT NOT NULL, `code` TEXT NOT NULL, `value` TEXT NOT NULL, `brandCreatorId` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`brandCreatorId`) REFERENCES `brand_table`(`id`) ON UPDATE CASCADE ON DELETE CASCADE );
CREATE INDEX IF NOT EXISTS `index_Model_brandCreatorId` ON `Model` (`brandCreatorId`);
CREATE TABLE IF NOT EXISTS `ApplicationBrandCrossRef` (`appId` INTEGER NOT NULL, `brandId` INTEGER NOT NULL, PRIMARY KEY(`appId`, `brandId`), FOREIGN KEY(`appId`) REFERENCES `application_table`(`id`) ON UPDATE CASCADE ON DELETE CASCADE , FOREIGN KEY(`brandId`) REFERENCES `brand_table`(`id`) ON UPDATE CASCADE ON DELETE CASCADE );
CREATE INDEX IF NOT EXISTS `index_ApplicationBrandCrossRef_brandId` ON `ApplicationBrandCrossRef` (`brandId`);
- 注意不要包含创建
room_master_table 或将行插入表中的SQL。
- 在 SQLite 工具中填充数据库(为此示例插入了 2 行),例如
:-
INSERT INTO `hymns_table` (title,author,lyrics) VALUES
('All things bright and beautiful','Fred','All things bright and beautiful,\nAll creatures great and small,\nAll things wise and wonderful:\nThe Lord God made them all.\nEach little flower that opens,\nEach little bird that sings,\nHe made their glowing colors,\nHe made their tiny wings.\n'),
('Onward Christian Soldiers','Mary','Onward, Christian soldiers, marching as to war,\nWith the cross of Jesus going on before.\nChrist, the royal Master, leads against the foe;\nForward into battle see His banners go!\nblah the great')
;
- 2 行添加了
All things bright and beautiful 和Onward Christian Soldiers(后者有额外的一行blah the great,所以两者都有一个共同的词)
-
保存/关闭数据库,再次打开并保存以确保已保存。
-
在项目中创建 assets 文件夹并将数据库文件(如果存在 -wal 和 -shm 文件(如果数据库已关闭,则不应存在))复制到 assets 文件夹中。
- 在示例中,文件名为
soanswers.db,因为这是我使用的连接。
例如:-
- 修改
Room.databaseBuilder 调用以包含 `.createFromAsset("the_filename_copied_into_the_assets_folder") 方法调用。
例如
instance = Room.databaseBuilder(context, TheDatabase::class.java,"hymn.db")
.createFromAsset("soanswers.db") //<<<<<< ADDED
.allowMainThreadQueries()
.build()
- 现在应该一切正常了。
在上一个答案的示例中,在执行上述步骤后,活动中使用的代码更改为:-
db = TheDatabase.getInstance(this)
dao = db.getHymnDao()
for(hymn: HymnEntity in dao.search("small")) {
Log.d("HYMNINFOR1","Hymn is ${hymn.title}")
}
for(hymn: HymnEntity in dao.search("on")) {
Log.d("HYMNINFOR2","Hymn is ${hymn.title}")
}
for(hymn: HymnEntity in dao.search("great")) {
Log.d("HYMNINFOR3","Hymn is ${hymn.title}")
}
结果输出到日志:-
2021-08-11 11:08:44.691 D/HYMNINFOR1: Hymn is All things bright and beautiful
2021-08-11 11:08:44.693 D/HYMNINFOR2: Hymn is Onward Christian Soldiers
2021-08-11 11:08:44.694 D/HYMNINFOR3: Hymn is All things bright and beautiful
2021-08-11 11:08:44.694 D/HYMNINFOR3: Hymn is Onward Christian Soldiers
即查询的前两次调用找到唯一的赞美诗匹配,第三次匹配两首赞美诗(因此为什么将伟大的 wass 添加到 Onward Christian Soldiers)。