按日期排序在 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;
我遇到了一个奇怪的问题。 在 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;