首页 > 解决方案 > 同时查询内部和外部对象 Realm Swift

问题描述

我有两个对象ConversationModelMessageModel如下

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)

我尝试过嵌套查询,但无法获得所需的结果。

标签: iosswiftrealm

解决方案


这并不完全是一个答案,而是更多地确认您的代码是正确的并且可以按预期工作。

为了进行测试,我复制并粘贴了您的代码并创建了示例数据,并向 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

推荐阅读