我正在使用带有@Fts4注释的@Entity的Room(版本2.6.1)来支持全文搜索(效果非常好)。
这是我的实体,这是 Room 自动创建来初始化我的数据库的版本。
我现在想向我的实体添加一个新字段,该字段也应该通过 FTS 进行索引,并按照 doc 创建自动迁移。
问题是,由于 FTS 表是虚拟表,它们无法更改,因此任何自动迁移都会失败。
我尝试编写手动迁移,然后删除并重新创建 FTS 表,如下所示:
static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(SupportSQLiteDatabase database) {
database.execSQL("DROP TABLE IF EXISTS recipes_fts;");
database.execSQL("CREATE VIRTUAL TABLE IF NOT EXISTS recipes_fts USING FTS4(title, description, source, ingredients, notes, tokenize=unicode61 `tokenchars=#`, content=`recipes`);");
database.execSQL("ALTER TABLE recipes ADD COLUMN notes TEXT;");
}
};
我有以下问题:
涉及 FTS 时,人们通常如何使用 Room 进行迁移?
我有
TestEntity
和TestFtsEntity
,这是我在没有迁移的情况下运行后得到的日志:
java.lang.IllegalStateException: Migration didn't properly
handle: TEST_FTS_TABLE(test.example.entity.TestFtsEntity).
Expected:
FtsTableInfo{name='TEST_FTS_TABLE', columns=[TEST_NAME, TEST_TEXT], options=[content=`TEST_TABLE`]'}
Found:
FtsTableInfo{name='TEST_FTS_TABLE', columns=[], options=[]'}
TEST_NAME
和 TEST_TEXT
是字段TEST_FTS_TABLE
和 TEST_TABLE
是表名称(显然)移民适合我:
// Drop incorrect table if needed
database.execSQL("DROP TABLE IF EXISTS TEST_FTS_TABLE")
// Create new one for fts
database.execSQL("CREATE VIRTUAL TABLE IF NOT EXISTS TEST_FTS_TABLE USING FTS4(NT_NAME, NT_TEXT, content=`TEST_TABLE`)")
// Retrigger fts to rebuild
database.execSQL("INSERT INTO TEST_FTS_TABLE(TEST_FTS_TABLE) VALUES ('rebuild')")
结果成功了!我还找到了某人的片段,这真的很有帮助:github链接