Я использую комнату dao из компонентов Android. Что мне нужно: вставить список, но перед этим удалить все данные из бд, чей id отличается от id из нового списка.
вот мой простой класс данных:
class Data{
String id; //unique for each data class
//some other data parameters here
}
Лучший вариант для моей задачи - использовать DELETE WHERE NOT IN someArray
. вот пример из моего кода:
@Query("DELETE " +
"FROM MY_TABLE " +
"WHERE data_id NOT IN ( :listOfId )")
abstract protected fun deleteUniqueData(listOfId:String):Int
Поэтому, когда я получаю новый список, который необходимо сохранить, я создаю следующую строку с идентификаторами: "'0','1'"
и вызываю метод deleteUniqueData
.
Но каждый раз, когда я вызываю это, я получаю в результате 2
, что означает, что там было удалено 2 строки.
Интересная часть: когда я заменяю
"WHERE data_id NOT IN ( :listOfId )")
с
"WHERE data_id NOT IN ('0','1')") //same data but hardcoded
В результате я получаю 0
. Похоже, это какая-то проблема с Room.
Есть идеи, почему NOT IN не работает? Или как это можно исправить?
ОБНОВЛЕНИЕ
вот сгенерированный запрос:
"DELETE FROM MY_TABLE WHERE data_id NOT IN ( ? )"
build/generated/source/
код, сгенерированный Room, и посмотрите, что там есть для вашегоNOT IN
сценария. - person CommonsWare   schedule 06.01.2018nativeExecuteForChangedRowCount
— это метод SQLiteConnection. - person Andriy Antonov   schedule 06.01.2018