我的 Android 应用程序使用 SQLite FTS3 表来提供全文搜索。我正在使用insertWithOnConflict
withCONFLICT_REPLACE
更新我的数据库,如果需要插入新行或更新现有行(如果存在)。
我很惊讶地发现我的表最终包含重复的行——但看起来这是 SQLite 的 FTS 模块的文档化“功能”:
数据类型和列约束与每列一起指定。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。