我遇到了一個奇怪的問題。僅在 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 中它不起作用。請幫我解決這個問題。
uj5u.com熱心網友回復:
也許您的查詢在以前的版本中巧合,但實際上是錯誤的。
它是一個聚合查詢,用于統計表中每個用戶的未讀訊息數chat_message_history。
您查詢中的缺陷是您想按訊息的日期排序,但是哪個日期?
對于每個用戶存在許多訊息。
您希望在最終排序中使用這些日期中的哪一個?
也許你想要第一個或最后一個。
在這種情況下,SQLite 將任意選擇一個日期(通常它選擇第一個,但這不能保證)。
在子句中使用像MIN()或這樣的聚合函式并簡化運算式:MAX()ORDER BYCASE
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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/403243.html
標籤:
