当必须将列添加到 @Fts4 实体时如何迁移 Room 数据库?

问题描述 投票:0回答:1

我正在使用带有@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;");
        }
    };

我有以下问题:

  1. 我还必须删除并重新创建 Room 为初始版本创建的触发器,并重建 FTS 表,这有点混乱,违背了我使用 Room 的目的
  2. 使用手动迁移时,我遇到了这个问题,但尚未找到解决方法
  3. 使用数据库检查器显示有很多自动生成的 FTS 相关表(请参阅 FTS 文档中的影子表),我不确定是否也可以保存删除这些表

涉及 FTS 时,人们通常如何使用 Room 进行迁移?

android android-sqlite android-room database-migration fts4
1个回答
0
投票

我有

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链接

© www.soinside.com 2019 - 2024. All rights reserved.