2012-01-07 3 views
6

Мне нужно решить эту проблему.Android SQLite ON CONFLICT UPDATE возможно?

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

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

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

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

Чтобы решить мою проблему, я учил эти решения:

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

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

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

+0

Вы найдете здесь полезные идеи: http://stackoverflow.com/questions/418898/sqlite-upsert-not-insert-or-replace –

ответ

7

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

Смежные вопросы