【发布时间】: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'))由于某种原因不起作用。
我很确定代码的执行顺序与上面给出的相同,但具体如下:
- 我正在使用
2.0.0-alpha03版本的 SQL Delight; - 内容表(“notes”)是使用 SQL Delight 在
.sq文件中创建的; - 虚拟表和触发器是在创建 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 没有返回任何结果。
有人知道为什么它可能不起作用吗?
【问题讨论】:
标签: android sqlite android-sqlite sqldelight