【问题标题】:SQL Delight FTS5 MATCH gives no resultsSQL Delight FTS5 MATCH 没有结果
【发布时间】:2022-06-30 14:37:21
【问题描述】:

我有下表:

CREATE TABLE IF NOT EXISTS "note" (
    "noteid"    INTEGER NOT NULL,
    "title" TEXT NOT NULL,
    "description"   TEXT NOT NULL,
    PRIMARY KEY("noteid")
);

然后我执行:

CREATE VIRTUAL TABLE IF NOT EXISTS NoteFts USING fts5(title, description, content='note', content_rowid='noteid');
CREATE TRIGGER IF NOT EXISTS note_ai AFTER INSERT ON note BEGIN INSERT INTO NoteFts(rowid, title, description) VALUES (new.noteid, new.title, new.description); END;
CREATE TRIGGER IF NOT EXISTS note_ad AFTER DELETE ON note BEGIN INSERT INTO NoteFts(NoteFts, rowid, title, description) VALUES ('delete', old.noteid, old.title, old.description); END;
CREATE TRIGGER IF NOT EXISTS note_au AFTER UPDATE ON note BEGIN INSERT INTO NoteFts(NoteFts, rowid, title, description) VALUES ('delete', old.noteid, old.title, old.description); INSERT INTO NoteFts(rowid, title, description) VALUES (new.noteid, new.title, new.description); END;

然后:

INSERT INTO note(title, description) VALUES ("note1", "desc1");
INSERT INTO note(title, description) VALUES ("note2", "desc2");

在数据库浏览器上

SELECT * FROM note WHERE noteid IN (SELECT rowid FROM NoteFts WHERE NoteFts MATCH 'note1';

完美运行。 在我的 Android 应用程序中,MATCH(或=,或NoteFts('note1'))由于某种原因不起作用。 我很确定代码的执行顺序与上面给出的相同,但具体如下:

  1. 我正在使用2.0.0-alpha03 版本的 SQL Delight;
  2. 内容表(“notes”)是使用 SQL Delight 在 .sq 文件中创建的;
  3. 虚拟表和触发器是在创建 SqlDriver 之后但在填充内容表之前在 SqlDriver.execute(null, "the SQL that creates the FTS5 table and triggers", 0) 中创建的。
  4. 通过测试,我发现正在创建 FTS5 表,所以这不是问题。尝试将其作为普通表进行查询可以正常工作。
  5. 我什至尝试INSERT INTO NoteFts(title, description) SELECT title, description FROM note; 以防万一,在整个代码中的不同位置,并再次尝试 - MATCH 没有返回任何结果。

有人知道为什么它可能不起作用吗?

【问题讨论】:

    标签: android sqlite android-sqlite sqldelight


    【解决方案1】:

    我现在有一个非常相似的问题。 MATCH 或其与= 的等价物未返回的原因之一是 FTS 索引似乎已损坏。不知何故,即使在“新”索引表上也会发生这种情况,即使在 DBBrowser 中完成也是如此。

    • 查看“6. 特殊 INSERT 命令”部分的 FTS5's documentation,其中解释了 integrity-checkrebuild 命令,重建后索引表应该开始返回结果。

    • 请记住,外部内容索引表仅存储索引数据,对它们上的索引列的任何查询都会传递到外部内容表,因此在对索引表进行普通查询时会得到非空结果。

    【讨论】:

      猜你喜欢
      • 2019-05-17
      • 2021-12-27
      • 2018-03-16
      • 2021-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-11
      • 2017-07-07
      相关资源
      最近更新 更多