我有以下表格:
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')
)由于某种原因不工作。我很确定代码的执行顺序与上面给出的相同,但这里有一些细节:
- 我使用的是
2.0.0-alpha03
版本的SQL Delight; - 使用SQL Delight在
.sq
文件中创建内容表("notes"); - 虚拟表和触发器是在SqlDriver创建之后、内容表填充之前在
SqlDriver.execute(null, "the SQL that creates the FTS5 table and triggers", 0)
中创建的。 通过测试,我发现FTS5表正在创建,所以这不是问题。想查询这是一个正常的表没问题。 - 我甚至尝试了
INSERT INTO NoteFts(title, description) SELECT title, description FROM note;
,以防万一,在整个代码的不同地方再次- MATCH没有返回任何结果。
有人知道为什么它可能不起作用吗?
我现在有一个非常类似的问题。MATCH或与=
等价的MATCH没有返回的一个原因是FTS索引似乎被破坏了。不知何故,即使在"新鲜"酒上也会发生这种情况。
-
查看FTS5关于"6的文档。特殊插入命令"章节中解释了
integrity-check
和rebuild
命令,重建索引表后应该开始返回结果。 -
请记住,外部内容索引表只存储索引数据,对它们上的索引列的任何查询都将传递到外部内容表,因此在对索引表进行普通查询时,结果是非空的。