我有两个名为Chat
和ChatMessage
的Realm对象。这两者之间存在着一对多的关系。
class Chat: Object {
dynamic var id: String = ""
dynamic var createdAt: Date = Date()
dynamic var creatorId: String = ""
let chatMessages = List<ChatMessage>()
override static func primaryKey() -> String? {
return "id"
}
}
class ChatMessage: Object {
dynamic var id: String = ""
dynamic var chatId: String = ""
dynamic var createdAt: Date = Date()
dynamic var read: Bool = false
dynamic var authorId: String = ""
dynamic var text: String = ""
let chat = LinkingObjects(fromType: Chat.self, property: "chatMessages").first
override static func primaryKey() -> String? {
return "id"
}
}
我需要显示一个聊天列表,其中最顶层的消息与最近的消息进行聊天。就像在所有聊天应用中一样为此,我想我需要按链接到每个聊天的Chat
对象的createdAt
属性值对ChatMessage
个对象进行排序。
这就是我现在所拥有的。
func getChats() -> Results<Chat> {
let realm = try! Realm()
let chats = realm.objects(Chat.self)
let predicate = NSPredicate(format: "SUBQUERY(Chat, $chat, $chat.chatMessages)", argumentArray: nil)
return chats.filter(predicate)
}
我不知道如何对子查询中的chatMessages
进行排序。或者,如果可能的话。搜索了Realm文档但无法找到任何内容。任何帮助表示赞赏。或者有任何建议,如果有更好的方法来解决这个问题。
答案 0 :(得分:1)
filter
查询用于隔离特定对象,而不是用于实际排序。因此,尝试在NSPredicate
中进行排序并不可行。
现在正在为allowing sorting via to-many child objects在Realm GitHub中跟踪一个问题。从理论上讲,这最终意味着你可以做到:
let chats = realm.objects(Chat.self).sorted(byKeyPath: "chatMessages.createdAt")
我绝对鼓励你在这个问题上添加+1,这样它的优先级就会提升。 :)
与此同时,虽然不是绝对令人惊讶的解决方案,但您可以向Date
添加额外的Chat
属性,该lastUpdated
只复制ChatMessage
复制最新日期{{1}对象。这样,您就可以直接对Chat
对象进行排序。