Мое приложение для Android использует таблицу SQLite FTS3 для обеспечения полнотекстового поиска. Я использую insertWithOnConflict
с 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) вслепую попытаться УДАЛИТЬ существующую строку (которая может или не может присутствовать), а затем ВСТАВИТЬ.