首页 > 解决方案 > 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());

当我调用我的查询时,我只想获取前两个元素。

标签: androidandroid-room

解决方案


如果你只想列出唯一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

推荐阅读