【问题标题】:order by date is not working in android 11 sqllite按日期排序在 android 11 sqlite 中不起作用
【发布时间】:2022-01-01 12:21:37
【问题描述】:

我遇到了一个奇怪的问题。 仅在 android 11 设备中使用 SQL lite 查询。

@Query("SELECT *, SUM(case when isReadMessage = 0 then 1 else 0 end) as countMessage from chat_message_history\n" +
            " where messageUser is not null GROUP BY messageUser ORDER by messageDate desc")
    LiveData<List<MessagesData>> getAllLiveUniqueUsers();

DAO 类

@Entity(tableName = "chat_message_history", indices = {
    @Index(value = "mesId")})
public class MessagesData {


@PrimaryKey(autoGenerate = true)
private int mesId;
private String message;
@TypeConverters(DateConverter.class)
private Date messageDate;
private boolean isReadMessage;
private int countMessage;
private String messageUser;
...}

日期转换器类

public class DateConverter {

@TypeConverter
public static Date toDate(Long timestamp) {
    return timestamp == null ? null : new Date(timestamp);
}

@TypeConverter
public static Long toTimestamp(Date date) {
    return date == null ? null : date.getTime();
}
}

输出应按日期排序,在 android 6 - android 10 中有效。在 android 11 中无效。 请帮我解决这个问题。

【问题讨论】:

    标签: android sqlite group-by android-sqlite sql-order-by


    【解决方案1】:

    也许您的查询在以前的版本中巧合,但实际上是错误的。

    是一个聚合查询,统计表chat_message_history的每个用户的未读消息数。

    您的查询中的缺陷是您想按消息的日期排序,但是哪个日期?
    每个用户都存在许多消息。
    您希望在最终排序中使用以下哪些日期?
    也许你想要第一个或最后一个。

    在这种情况下,SQLite 会任意选择一个日期(通常它会选择第一个日期,但这并不能保证)。

    ORDER BY 子句中使用MIN()MAX() 之类的聚合函数,并简化CASE 表达式:

    SELECT *, SUM(isReadMessage = 0) AS countMessage 
    FROM chat_message_history
    WHERE messageUser IS NOT NULL 
    GROUP BY messageUser 
    ORDER by MAX(messageDate) DESC;
    

    我上面提到的关于 SQLite 为 messageDate 选择任意值的所有内容也适用于 SELECT * 返回的列的值。

    如果你只返回聚合列会更好:

    SELECT messageUser,
           MAX(messageDate) last_date, 
           SUM(isReadMessage = 0) AS countMessage 
    FROM chat_message_history
    WHERE messageUser IS NOT NULL 
    GROUP BY messageUser 
    ORDER by last_date DESC;
    

    【讨论】:

    • 非常感谢@forpas,它确实有效。
    猜你喜欢
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多