【发布时间】:2020-06-01 09:12:04
【问题描述】:
我一直在尝试使用 FTS 表的新 Android 房间 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)
当我还在原始表中添加行时,我希望在 FTS 中添加每一行(ChatMessageEntity - 未显示)。从头开始重建 FTS 表时,它工作得很好(上面的ftsRebuild())。
但是,我希望单独添加每个输入。我已经尝试了很多东西(例如上面显示的saveFtsMessage()) - 不带 docId 添加,尝试使用 rowId,...我什至尝试将新对象 ChatMessageEntity 添加到 ChatMessageFts 作为输入,但我没有设法编译这是由于错误。
欢迎任何关于如何在 FTS 表中添加个人输入的建议!
【问题讨论】:
-
你不应该需要这些
INSERT INTO ChatMessageFts语句中的任何一个。插入ChatMessage将通过触发器填充ChatMessageFts。 -
@CommonsWare 非常感谢。不知道我以前怎么没有意识到这一点。你认为我应该关闭这个问题还是将你的答案标记为已接受(如果是,请在下面添加)?
标签: android sqlite full-text-search android-room fts4