按日期排序在 android 11 sqlite 中不起作用

order by date is not working in android 11 sqllite

我遇到了一个奇怪的问题。 在 android 11 台设备中使用 SQL 精简版查询。

@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 class

@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;
...}

日期转换器class

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 中无效。 请帮我解决这个问题。

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

统计tablechat_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 * 编辑的 return 列的值。

如果您 return 只聚合像这样的列会更好:

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;