【发布时间】:2012-11-09 01:11:11
【问题描述】:
我的 Android 应用使用 SQLite FTS3 表提供全文搜索。我正在使用 insertWithOnConflict 和 CONFLICT_REPLACE 来更新我的数据库,如果需要插入新行或更新现有行(如果存在)。
我很惊讶地发现我的表最终包含重复的行 - 但看起来这是 SQLite 的 FTS 模块的文档化“功能”:
来自SQLite FTS3 and FTS4 Extensions 页面:
数据类型和列约束与每列一起指定。 FTS 和 SQLite 完全忽略了这些。
从命令行复制副本非常容易:
sqlite> CREATE VIRTUAL TABLE test_duplicates USING FTS3
...> (id INTEGER PRIMARY KEY, name TEXT);
sqlite> INSERT INTO test_duplicates (id, name) VALUES (1, "George");
sqlite> INSERT INTO test_duplicates (id, name) VALUES (1, "George");
sqlite> INSERT OR REPLACE INTO test_duplicates (id, name) VALUES (1, "George");
sqlite> SELECT * FROM test_duplicates;
1|George
1|George
1|George
sqlite>
我的问题是:复制CONFLICT_REPLACE 行为的最佳(最简单、最可靠)方法是什么?
我目前的想法是 (A) 执行 SELECT,然后根据结果执行 UPDATE 或 INSERT,或者 (B) 盲目尝试删除现有行(可能存在也可能不存在)然后 INSERT。
【问题讨论】: