ios - 同时查询内部和外部对象 Realm Swift
问题描述
我有两个对象ConversationModel和 MessageModel如下
class ConversationModel: Object, NSCoding {
@objc dynamic var conversation_id : String?
@objc dynamic var display_name : String?
@objc dynamic var to_jid : String?
@objc dynamic var from_jid : String?
@objc dynamic var unread_count : Int = 0
@objc dynamic var last_timestamp : String?
@objc dynamic var group_name : String?
@objc dynamic var group_id : String?
@objc dynamic var ghost_name : String?
@objc dynamic var ghost_password : String?
@objc dynamic var ghost_message : String?
@objc dynamic var user_profile_image : String?
@objc dynamic var last_message_status : String?
@objc dynamic var m_body : String?
@objc dynamic var sender_timestamp : String?
@objc dynamic var m_type : String?
@objc dynamic var receiver_timestamp : String?
@objc dynamic var userCustomProfileImageUrl: String?
@objc dynamic var profileImageUrl: String?
@objc dynamic var userImageHashKey: String?
@objc dynamic var userImageBase64String : String?
@objc dynamic var sender_jid : String?
@objc dynamic var reciever_jid: String?
@objc dynamic var sending_status: String?
@objc dynamic var is_blocked : Bool = false
@objc dynamic var is_business : Bool = false
@objc dynamic var is_ghost_enable : Bool = false
@objc dynamic var is_deleted : Bool = false
@objc dynamic var is_offline : Bool = false
@objc dynamic var is_archive : Bool = false
@objc dynamic var is_group : Bool = false
@objc dynamic var is_pin : Bool = false
@objc dynamic var is_mute : Bool = false
@objc dynamic var mute_time : String?
@objc dynamic var dataForImage : Data?
@objc dynamic var phoneNumber: String?
@objc dynamic var is_removed: Bool = false
@objc dynamic var audio_playedtime :String?
@objc dynamic var userThumbnailImage : String?
var messagesList = List<MessageModel>()
}
消息模型是
class MessageModel: Object, NSCoding {
@objc dynamic var burning_msg_timestamp: String?
@objc dynamic var is_burning_msg : Int = 0
@objc dynamic var delivered_timestamp: String?
@objc dynamic var read_timestamp: String?
@objc dynamic var message_id: String?
@objc dynamic var reciever_id: String?
@objc dynamic var conversation_id: String?
@objc dynamic var body: String?
@objc dynamic var url: String?
@objc dynamic var sender_timestamp: CLong = 0
@objc dynamic var receiver_timestamp: String?
@objc dynamic var forward_tag: Int = 0
@objc dynamic var message_type: String?
@objc dynamic var stanza_id: String?
@objc dynamic var selected_message_reply_id: String?
@objc dynamic var burn_time: String?
@objc dynamic var schedule_timestamp: String?
@objc dynamic var is_scheduled: Bool = false
@objc dynamic var room_jid: String?
@objc dynamic var sender_jid: String?
@objc dynamic var is_deleted: Bool = false
}
我想获取所有的对话,is_archive == false
并且只有messageslist
那些is_deleted = false
我正在尝试使用此代码获取,但它仅过滤 ConversationModel 而不是在消息模型上应用过滤器
var result = realm.objects(ConversationModel.self).filter("is_archive = \(is_archive)
AND ANY messagesList.is_deleted == \(boolFalse) AND ANY messagesList.sender_timestamp <=
\(timeStamp)").sorted(byKeyPath: "last_timestamp", ascending: false)
我尝试过嵌套查询,但无法获得所需的结果。
解决方案
这并不完全是一个答案,而是更多地确认您的代码是正确的并且可以按预期工作。
为了进行测试,我复制并粘贴了您的代码并创建了示例数据,并向 ConversationModel 添加了一个 _id 对象,这样我就可以知道查询正在检索哪个对象。
所以我们进行了三个对话,每个对话都有一条信息。目标是让查询检索对话 c1;它的 is_archive 为假,它有一条消息,其中 is_deleted 为假,并且 sender_timestamp <= 5
let c0 = ConversationModel()
c0._id = "c0"
c0.is_archive = true
let c1 = ConversationModel()
c1._id = "c1"
c1.is_archive = false
let c2 = ConversationModel()
c2._id = "c2"
c2.is_archive = false
let m0 = MessageModel()
let m1 = MessageModel()
let m2 = MessageModel()
m0.sender_timestamp = 0
m1.sender_timestamp = 1
m2.sender_timestamp = 2
m0.is_deleted = true
m1.is_deleted = false
m2.is_deleted = true
c0.messagesList.append(m0)
c1.messagesList.append(m1)
c2.messagesList.append(m2)
try! realm.write {
realm.add([c0, c1, c2])
}
然后我运行了你的查询,添加了 vars。
let is_archive = false
let boolFalse = false
let timeStamp = 5
var results = realm.objects(ConversationModel.self).filter("is_archive = \(is_archive) AND ANY messagesList.is_deleted == \(boolFalse) AND ANY messagesList.sender_timestamp <= \(timeStamp)").sorted(byKeyPath: "last_timestamp", ascending: false)
产生了这个输出
c1
推荐阅读
- angular - Angular 9 - 不能在 ngFor 语句中使用 Observable
- if-statement - lisp中有嵌套的if吗?
- c++ - 如何在没有大量重复检查代码的情况下处理函数的多个可能的早期返回
- python - 带有 r 对数刻度的径向图的刻度位置
- tsql - 使用某些链接服务器组件执行触发器
- reactjs - react-table v7 总是重新挂载?
- javascript - TypeWriter 效果没有与标题内联
- python - 在 SymPy 中反转函数
- python-3.x - Python 3 Tkinter 画布窗口绑定
- python - PySide SizeHint 和 PaintEvent 返回不同的大小