Удаление SQL, где NOT IN не работает

Я использую комнату 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 ( ? )"

person Andriy Antonov    schedule 06.01.2018    source источник
comment
Посмотрите на сгенерированный код и посмотрите, где он идет не так.   -  person CommonsWare    schedule 06.01.2018
comment
Я пытался! Но я пришел к нативным методам и не могу их отладить. Перед вызовом нативных методов все выглядит нормально   -  person Andriy Antonov    schedule 06.01.2018
comment
Но я пришел к нативным методам и не могу их отладить — Room не использует NDK, поэтому я не уверен, о чем вы говорите. Я должен был быть более ясным: поищите в build/generated/source/ код, сгенерированный Room, и посмотрите, что там есть для вашего NOT IN сценария.   -  person CommonsWare    schedule 06.01.2018
comment
ты прав. nativeExecuteForChangedRowCount — это метод SQLiteConnection.   -  person Andriy Antonov    schedule 06.01.2018
comment
Сгенерированный @CommonsWare запрос выглядит нормально.   -  person Andriy Antonov    schedule 06.01.2018


Ответы (1)


Измените deleteUniqueData(), чтобы получить список или массив идентификаторов в качестве параметра. Не составляйте список с разделителями-запятыми самостоятельно. Комната делает это.

person CommonsWare    schedule 06.01.2018