Комната не возвращает дубликаты - PullRequest
0 голосов
/ 12 мая 2019

Итак, у меня есть настроенная база данных комнаты, все в порядке, поэтому я могу делать запросы и вставки, удалять и т. Д. Без проблем, однако я просто столкнулся с ситуацией, когда id хотел бы возвращать записи по их идентификаторам и дубликатам.должно быть разрешено, однако номер удаляет дубликаты, поэтому, например, я отправляю ему список идентификаторов, скажем, <1,2,3,2,3>, и он возвращает элементы по их идентификаторам, но отправляет только <1,2,3.> удаление повторяющихся записей.Запрос, который я делаю, ниже (кстати, полный noob в sql)

@Query("SELECT * FROM card WHERE cardId IN(:cardId)")
LiveData<List<Card>> getCardsByIds(List<Integer> cardId);

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

CARD REPO вызывает мой метод Daos, как этот

public LiveData<List<Card>> getCardsByIds(List<Integer> cardIds){
    return cardDao.getCardsByIds(cardIds);
}

ViewModel вызывает их

private MutableLiveData<List<Integer>> cardIds;
//** constructor etc
cards = Transformations.switchMap(cardIds, id -> cardRepository.getCardsByIds(id));

и через магию SwitchMap, когдаОбновление списка cardIds делает новый запрос, и я наблюдаю ViewModel из моего фрагмента.Я отладил его, поэтому я знаю, что список идентификаторов правильный и содержит дубликаты идентификаторов, но в возвращенном списке LiveData отсутствуют дубликаты идентификаторов.любая помощь?

1 Ответ

0 голосов
/ 12 мая 2019

Редактировать:

SQLiteDatabase всегда представляет результаты в виде курсора в виде таблицы, которая напоминает базу данных SQL.

Источник: Обучение разработчиков Google

До того, как результаты будут возвращены запросом, результаты сохраняются в таблице, и если есть строки с дублирующимися первичными ключами,по умолчанию они будут опущены.

Чтобы достичь того, что вы хотите, вы можете выполнить запрос, чтобы найти отдельный элемент по идентификатору в цикле и добавить результат в список.

Обновлен метод DAO:

@Query("SELECT * FROM card WHERE cardId=:cardId")
LiveData<Card> getCardById(Integer cardId);

Обновить метод репозитория:

public LiveData<List<Card>> getCardsByIds(List<Integer> cardIds){
    List list = new ArrayList();
    for(Integer cardId: cardIds){
      list.append(cardDao.getCardById(cardId));
    }
    return list;
}

Надеюсь, это поможет.

Оригинальный ответ:

Если id является первичным ключом вашей модели, он не позволяет вводить повторяющиеся данные.Следовательно, при получении вы можете обнаружить, что дубликаты отсутствуют.

Если у вас есть id с дубликатом, создайте еще один атрибут для первичного ключа.(используйте автогенерацию, если у вас нет атрибута первичного ключа)

Первичный ключ по умолчанию является УНИКАЛЬНЫМ, а НЕ НЕДЕЙСТВИТЕЛЕН.

...