#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. Да, я отредактировал свой вопрос, добавив пример, спасибо.