私の Android アプリは、SQLite FTS3 テーブルを使用して全文検索を提供しています。insertWithOnConflict
withを使用しCONFLICT_REPLACE
てデータベースを更新し、必要に応じて新しい行を挿入したり、存在する場合は既存の行を更新したりしています。
テーブルに重複した行が含まれていることに非常に驚きましたが、これは SQLite の FTS モジュールの文書化された「機能」のようです。
SQLite FTS3 および FTS4 拡張機能ページから:
データ型と列の制約は、各列とともに指定されます。これらは 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) 既存の行 (存在する場合と存在しない場合があります) をやみくもに DELETE してから INSERT を試みることです。