Комната 2.1 SQLite FTS: вставка нового единого объекта FTS в базу данных - PullRequest
1 голос
/ 17 февраля 2020

Я пытался использовать новую функцию Room 2.1 в таблице FTS Android для включения функции поиска.

Объект:

 @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)

Я хочу sh добавить каждую строку в FTS, когда я также добавлю строку в исходную таблицу (ChatMessageEntity - нет показано). При восстановлении таблицы FTS с нуля она отлично работает (ftsRebuild() выше).

Тем не менее, я sh добавлю каждый вход отдельно. Я перепробовал много вещей (например, saveFtsMessage(), показанный выше) - добавление без docId, попытка с rowId, ... Я даже пытался добавить новый объект ChatMessageEntity в ChatMessageFts в качестве ввода, но мне не удалось скомпилировать это из-за ошибок.

Любое предложение о том, как я могу добавить индивидуальный ввод в таблицу FTS, приветствуется!

1 Ответ

2 голосов
/ 17 февраля 2020
@Fts4(contentEntity = ChatMessageEntity::class)

Волшебство c свойства contentEntity аннотации заключается в том, что Room устанавливает триггеры для синхронизации таблицы FTS с c с соответствующей таблицей сущностей:

"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"
]

(из этого примера приложения из этой книги )

Пока вы вставляете, обновляете и удаляете свои сущности, таблица FTS будет поддерживаться автоматически. Вы просто используете таблицу FTS для запросов.

Если вы пропустите аннотацию contentEntity - и предположите, что это работает - тогда вам, возможно, придется поддерживать свою таблицу FTS независимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...