Комната Android: выберите список пользовательских объектов, удаляющих дубликаты по определенному свойству

#android #android-room

#Android #android-room

Вопрос:

Я использую библиотеку Room для повторного просмотра списка без дубликатов для свойства «текст».
Это код запроса в классе MyObjectDao:

 @Query("SELECT DISTINCT * FROM historyentity WHERE text LIKE :inputText || '%'")
List<MyObject> findByText(String inputText);
  

Я также публикую класс MyObject:

 @Entity
public class MyObject {

@PrimaryKey(autoGenerate = true)
public int uid;

@ColumnInfo(name = "text")
public String text;

@ColumnInfo(name = "timestamp")
public Long timestamp;
  

}

В любом случае я все равно получаю результаты с дубликатами для поля «текст». Как я могу получить список, который не содержит дубликатов в поле «текст»?

Например, если у меня есть следующие три элемента в базе данных

 database.addMyObject(new MyObject("dog", System.currentTimeInMills());
database.addMyObject(new MyObject("cat", System.currentTimeInMills());
database.addMyObject(new MyObject("dog", System.currentTimeInMills());
  

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

Комментарии:

1. что || '%' предполагается делать? это подстановочный знак, и я думаю, что это портит результат

Ответ №1:

Если вы хотите просто список с уникальными text значениями, вы можете попробовать это:

 @Query("SELECT DISTINCT text FROM historyentity WHERE text LIKE :inputText || '%'")
List<String> findByText(String inputText); // <-- changed type to List<String>
  

Обновить

Вы можете попробовать этот запрос (он получает только один элемент со text значением — с максимальным id — или вы можете использовать максимальный (или минимальный) timestamp ):

 Select * from historyentity as t1
    INNER JOIN (select text,max(uid) as uid from historyentity WHERE text LIKE :inputText group by text) t2
    ON t1.text = t2.text and t1.uid = t2.uid
  

Комментарии:

1. Я хочу иметь список <MyObject> вместо списка<String> . Но в списке я не хочу иметь элементы с одним и тем же «текстовым» полем.

2. Итак, если есть несколько элементов с одним и тем же text полем, вы ожидаете получить любой из них (но только один из них)? На первый взгляд это кажется странным. Можете ли вы привести какой-нибудь пример в своем сообщении для ясности?

3. Да, я отредактировал свой вопрос, добавив пример, спасибо.