SQL Delight FTS5 MATCH没有结果



我有以下表格:

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");

On DB Browser

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. 使用SQL Delight在.sq文件中创建内容表("notes");
  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没有返回任何结果。

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

我现在有一个非常类似的问题。MATCH或与=等价的MATCH没有返回的一个原因是FTS索引似乎被破坏了。不知何故,即使在"新鲜"酒上也会发生这种情况。

  • 查看FTS5关于"6的文档。特殊插入命令"章节中解释了integrity-checkrebuild命令,重建索引表后应该开始返回结果。

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

相关内容

最新更新