Номер не возвращает дубликаты

Итак, у меня есть база данных комнат, все настроено, все в порядке, поэтому я могу делать запросы и вставки, удалять и т. Д. Без проблем, однако я только что столкнулся с ситуацией, когда id хотел бы возвращать записи по их идентификаторам, а дубликаты должны быть разрешены , однако комната удаляет дубликаты, поэтому, например, я отправляю ему список идентификаторов, например ‹1,2,3,2,3>, и он возвращает элементы по их идентификаторам, но отправляет мне только‹ 1,2,3>, удаляя повторяющиеся записи. Запрос, который я делаю, ниже (кстати, полный нуб в 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 отсутствуют повторяющиеся идентификаторы. любая помощь?


person martinseal1987    schedule 12.05.2019    source источник
comment
id является первичным ключом таблицы базы данных?   -  person Abhimanyu    schedule 12.05.2019
comment
да это первичный ключ   -  person martinseal1987    schedule 12.05.2019


Ответы (1)


Изменить:

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 с дубликатом, создайте другой атрибут для первичного ключа. (используйте автогенерацию, если у вас нет атрибута первичного ключа)

Первичный ключ по умолчанию UNIQUE и NOT NULL.

person Abhimanyu    schedule 12.05.2019
comment
я думаю, что вы упустили момент, я хочу, чтобы он возвращал ту же запись дважды, если я попросил об этом] - person martinseal1987; 12.05.2019
comment
Я не пытался вставить модель с тем же идентификатором. Я пытаюсь получить одну и ту же запись несколько раз, если ее запрашивали несколько раз, но в одном и том же запросе, поэтому, например, у меня есть идентификаторы ids ‹1,2,3› в моей базе данных i хотел бы отобразить ‹1,2,3,1,2,3› это те же самые записи, я бы просто хотел, чтобы они отображались дважды, но когда я запрашиваю для него дубликаты, они пропускаются, что я не думаю, что правильно, я думаю sql в этом случае должен вернуться. правильные результаты - person martinseal1987; 12.05.2019
comment
Хорошо, большое спасибо, хотя ваши комментарии о том, что вы хотите, вы можете выполнить запрос, чтобы найти один элемент по идентификатору в цикле и добавить результат в список. не будет работать с живыми данными, поэтому, возможно, ваша первоначальная идея создания другого ключа / идентификатора сработает, большое спасибо - person martinseal1987; 12.05.2019
comment
Я нигде не вижу ссылки на это До того, как результаты будут возвращены запросом, результаты сохраняются в таблице, и если есть строки с повторяющимися первичными ключами, они будут опущены по умолчанию. - person martinseal1987; 12.05.2019
comment
Это то, что я понял, нигде не сказано. - person Abhimanyu; 12.05.2019
comment
Позвольте нам продолжить это обсуждение в чате. - person Abhimanyu; 12.05.2019