Android SQLite ON CONFLICT UPDATE возможно? - PullRequest
7 голосов
/ 07 января 2012

Мне нужно решить эту проблему.

Я начал свой проект с неверной концепции, что ON CONFLICT REPLACE будет обновлять содержимое строки, когда обнаружит конфликт.Также я думал, что в этой вставке (с конфликтом), если я не укажу значение для столбца, он не будет заменять, а сохранит старое значение.Вместо этого я просто обнаружил, что ON CONFLICT REPLACE, если он обнаружит конфликт, он сделает delete-> insert, и если он не может найти значение для столбца (где я поставил ноль, чтобы не обновлять поле), он заменит нульзначение со значением столбца по умолчанию для успешного выполнения вставки.

Итак, знайте, у меня есть проблема с большими корнями: D

Как вы понимаете, я хочу достичь этого:

Я всегда делаю вставку, если он находит строку с такими же уникальными ключами (конфликт), он только обновляет значения.Если для поля он не найдет значения (я не помещаю его в ContentValues), он не будет обновлять это поле, а сохранит старое (как обычный запрос на обновление, где вы не ставите столбец для его обновления).

Чтобы решить мою проблему, я попытался найти следующие решения:

  • ON CONFLICT UPDATE (это будет работать, только если у вас есть только 1 уникальное поле, если у вас есть 2 или более уникальных поля, которые выбрасываютконфликт это приведет к сбою)
  • ОБНОВЛЕНИЕ НА ВСТАВКЕ ОТКАЗА, где он всегда пытается сделать обновление.Если происходит сбой, потому что он не может найти строку, относящуюся к записи (она еще не присутствует в БД), он попытается выполнить вставку

Кто-то уже думал об этой проблеме и имеетрешение?Или, может быть, мы можем просто попытаться найти решение:)

Я думаю, что лучший способ - это поддерживать низкий уровень (уровень БД), чтобы поддерживать хороший уровень производительности.

1 Ответ

8 голосов
/ 28 сентября 2012

В соответствии с официальной документацией SQLite3 невозможно выполнить автоматическое ОБНОВЛЕНИЕ КОНФЛИКТА, а только ЗАМЕНУ, аналогичную УДАЛИТЬ -> ВСТАВИТЬ (новые значения).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...