Room 2.1 SQLite FTS:在数据库中插入新的单个 FTS 对象
Room 2.1 SQLite FTS: inserting new single FTS object in database
我一直在尝试使用 FTS table 的新 Android Room 2.1 功能来启用搜索功能。
实体:
@Entity
class ChatMessageEntity(
@PrimaryKey
var messageId: String,
var messageUser: String,
var messageText: String,
)
FTS实体:
@Fts4(contentEntity = ChatMessageEntity::class)
@Entity
class ChatMessageFts(
var messageText: String //only want messageText searchable
)
数据库:
@Database(entities = [ChatMessageEntity::class, ChatMessageFts::class], version = 1)
abstract class ChatMessageDatabase : RoomDatabase() {
abstract fun chatMessageDatabase(): ChatMessageDao
companion object {
fun create(context: Context) = Room.databaseBuilder(context, ChatMessageDatabase::class.java, DB_NAME).build()
}
}
DAO:
@Query("INSERT INTO ChatMessageFts(ChatMessageFts) VALUES('rebuild')") //works
suspend fun ftsRebuild()
@Query("INSERT INTO ChatMessageFts(docid, messageText) VALUES(:id, :text)") //compiles but doesn't work
suspend fun saveFtsMessage(id: Long, text: String)
当我还在原始 table 中添加行时,我希望在 FTS 中添加每一行(ChatMessageEntity - 未显示)。从头开始重建 FTS table 时,它运行良好(ftsRebuild()
以上)。
但是,我希望单独添加每个输入。我已经尝试了很多东西(例如上面显示的 saveFtsMessage()
)——添加时不使用 docId,尝试使用 rowId,...我什至尝试将新对象 ChatMessageEntity
作为输入添加到 ChatMessageFts
中,但我由于错误未能成功编译它。
欢迎就如何在 FTS table 中添加个人输入提出任何建议!
@Fts4(contentEntity = ChatMessageEntity::class)
注解contentEntity
属性的神奇之处在于,Room设置了触发器,让你的FTStable与相应的实体table保持同步:
"contentSyncTriggers": [
"CREATE TRIGGER IF NOT EXISTS room_fts_content_sync_paragraphsFts_BEFORE_UPDATE BEFORE UPDATE ON `paragraphs` BEGIN DELETE FROM `paragraphsFts` WHERE `docid`=OLD.`rowid`; END",
"CREATE TRIGGER IF NOT EXISTS room_fts_content_sync_paragraphsFts_BEFORE_DELETE BEFORE DELETE ON `paragraphs` BEGIN DELETE FROM `paragraphsFts` WHERE `docid`=OLD.`rowid`; END",
"CREATE TRIGGER IF NOT EXISTS room_fts_content_sync_paragraphsFts_AFTER_UPDATE AFTER UPDATE ON `paragraphs` BEGIN INSERT INTO `paragraphsFts`(`docid`, `prose`) VALUES (NEW.`rowid`, NEW.`prose`); END",
"CREATE TRIGGER IF NOT EXISTS room_fts_content_sync_paragraphsFts_AFTER_INSERT AFTER INSERT ON `paragraphs` BEGIN INSERT INTO `paragraphsFts`(`docid`, `prose`) VALUES (NEW.`rowid`, NEW.`prose`); END"
]
(来自 this sample app from this book)
只要您插入、更新和删除实体,FTS table 就会自动维护。您只需使用 FTS table 进行查询。
如果您跳过 contentEntity
注释——假设它有效——那么您可能需要独立维护您的 FTS table。
我一直在尝试使用 FTS table 的新 Android Room 2.1 功能来启用搜索功能。
实体:
@Entity
class ChatMessageEntity(
@PrimaryKey
var messageId: String,
var messageUser: String,
var messageText: String,
)
FTS实体:
@Fts4(contentEntity = ChatMessageEntity::class)
@Entity
class ChatMessageFts(
var messageText: String //only want messageText searchable
)
数据库:
@Database(entities = [ChatMessageEntity::class, ChatMessageFts::class], version = 1)
abstract class ChatMessageDatabase : RoomDatabase() {
abstract fun chatMessageDatabase(): ChatMessageDao
companion object {
fun create(context: Context) = Room.databaseBuilder(context, ChatMessageDatabase::class.java, DB_NAME).build()
}
}
DAO:
@Query("INSERT INTO ChatMessageFts(ChatMessageFts) VALUES('rebuild')") //works
suspend fun ftsRebuild()
@Query("INSERT INTO ChatMessageFts(docid, messageText) VALUES(:id, :text)") //compiles but doesn't work
suspend fun saveFtsMessage(id: Long, text: String)
当我还在原始 table 中添加行时,我希望在 FTS 中添加每一行(ChatMessageEntity - 未显示)。从头开始重建 FTS table 时,它运行良好(ftsRebuild()
以上)。
但是,我希望单独添加每个输入。我已经尝试了很多东西(例如上面显示的 saveFtsMessage()
)——添加时不使用 docId,尝试使用 rowId,...我什至尝试将新对象 ChatMessageEntity
作为输入添加到 ChatMessageFts
中,但我由于错误未能成功编译它。
欢迎就如何在 FTS table 中添加个人输入提出任何建议!
@Fts4(contentEntity = ChatMessageEntity::class)
注解contentEntity
属性的神奇之处在于,Room设置了触发器,让你的FTStable与相应的实体table保持同步:
"contentSyncTriggers": [
"CREATE TRIGGER IF NOT EXISTS room_fts_content_sync_paragraphsFts_BEFORE_UPDATE BEFORE UPDATE ON `paragraphs` BEGIN DELETE FROM `paragraphsFts` WHERE `docid`=OLD.`rowid`; END",
"CREATE TRIGGER IF NOT EXISTS room_fts_content_sync_paragraphsFts_BEFORE_DELETE BEFORE DELETE ON `paragraphs` BEGIN DELETE FROM `paragraphsFts` WHERE `docid`=OLD.`rowid`; END",
"CREATE TRIGGER IF NOT EXISTS room_fts_content_sync_paragraphsFts_AFTER_UPDATE AFTER UPDATE ON `paragraphs` BEGIN INSERT INTO `paragraphsFts`(`docid`, `prose`) VALUES (NEW.`rowid`, NEW.`prose`); END",
"CREATE TRIGGER IF NOT EXISTS room_fts_content_sync_paragraphsFts_AFTER_INSERT AFTER INSERT ON `paragraphs` BEGIN INSERT INTO `paragraphsFts`(`docid`, `prose`) VALUES (NEW.`rowid`, NEW.`prose`); END"
]
(来自 this sample app from this book)
只要您插入、更新和删除实体,FTS table 就会自动维护。您只需使用 FTS table 进行查询。
如果您跳过 contentEntity
注释——假设它有效——那么您可能需要独立维护您的 FTS table。