当Android Room中的字段为空时,如何按顺序排序

4
我使用了Room持久化库来存储联系人信息。 我想通过姓和名来检索联系人。 问题在于没有姓和名的联系人(null)会出现在列表的顶部。如何查询以使它们出现在列表底部? 以下是我的查询语句:
select * from CacheContact order by lastName asc,firstName asc LIMIT :count OFFSET :offset

CacheContact 对象:

@Entity
public class CacheContact {

    private String expireDate;

    @PrimaryKey
    private long id;
    private String firstName;
    private long userId;
    private String lastName;
    private Boolean blocked;
    private long creationDate;
    private String profileImage;

    @Embedded
    private LinkedUser linkedUser;
    private String cellphoneNumber;
    private String email;
    private String uniqueId;
    private long notSeenDuration;
    private boolean hasUser;

完整的DAO方法:

@Query("select * from CacheContact order by lastName asc,firstName asc LIMIT :count OFFSET :offset")
    List<CacheContact> getContacts(Integer count, Long offset);
2个回答

3

试试这样:

select * from CacheContact order by lastName is null or lastName='', lastName, firstName is null or firstName='', firstName LIMIT :count OFFSET :offset

上述查询还检查了空字符串值。
SQLite Release 3.30.0开始,您还可以使用NULLS LAST,这样您就可以执行以下操作:
select * from table order by column_name NULLS LAST;

你能解释更多关于这个吗?是 null 还是 lastName=''? - HiddenCoder7
1
@HiddenCoder7 它正在检查列是否为空或为空字符串,如果您不想要空字符串部分,则可以从查询中删除 or 部分。 - Nongthonbam Tonthoi

1
select * from CacheContact 
order by case when lastName is null or firstName is null then 1 else 0 end, 
lastName asc, firstName asc LIMIT :count OFFSET :offset

谢谢,但是使用这个查询后,联系人的null firstName和lastName从第一位置移动到第三位置,但是这个答案更准确,并将该联系人发送到末尾: https://dev59.com/Pbroa4cB1Zd3GeqPoabN#61484232 - HiddenCoder7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接