在Realm Swift中过滤嵌套数组上的对象

时间:2017-06-12 13:45:55

标签: ios swift realm

我有ChatConversationModel的主模型,它有一个数组属性userAcitivities,它是一个ChatUserAcitivityModel个对象的数组。我想从Realm获取ChatConversationModel包含给定userAcitivities的{​​{1}}对象。我尝试了几种不同的方法,但未能得到我追求的结果。

friendID

目前我正在做以下事情并且它正在为我工​​作,但我想找到最好的表达方式:

import Foundation
import RealmSwift
import ObjectMapper

class ChatConversationModel: Object, Mappable {

    dynamic var id = ""
    dynamic var typeIndex = ChatTypes.ChatType.oneToOne.index
    var userAcitivities = List<ChatUserAcitivityModel>()

    override class func primaryKey() -> String? {
        return "id"
    }

    convenience required init?(map: Map) {
        self.init()
    }

    func mapping(map: Map) {
        if map.mappingType == .fromJSON {
            id <- map["id"]
            typeIndex <- map["typeIndex"]
            userAcitivities <- (map["userAcitivities"], ListTransform<ChatUserAcitivityModel>())
        } else {
            id >>> map["id"]
            typeIndex >>> map["typeIndex"]
            userAcitivities >>> (map["userAcitivities"], ListTransform<ChatUserAcitivityModel>())
        }
    }

}

import Foundation
import RealmSwift
import ObjectMapper

class ChatUserAcitivityModel: Object, Mappable {

    dynamic var userID = ""
    /// This is necessary in order to know from what point to download the chat if the user deleted it.
    /// If this property is 0.0, then there has never been a deletion.
    dynamic var removedChatTimeStamp = 0.0

    override class func primaryKey() -> String? {
        return "userID"
    }

    convenience required init?(map: Map) {
        self.init()
    }

    func mapping(map: Map) {
        if map.mappingType == .fromJSON {
            userID <- map["userID"]
            removedChatTimeStamp <- map["removedChatTimeStamp"]
        } else {
            userID >>> map["userID"]
            removedChatTimeStamp >>> map["removedChatTimeStamp"]
        }
    }

}

func getFriendChatConversationModel(_ friendID: String)  {
    let realm = try! Realm()
    let chatConversationModels = realm.objects(ChatConversationModel.self).filter("typeIndex = %@", ChatTypes.ChatType.oneToOne.index)
    let friend = chatConversationModels.filter { $0.userAcitivities.filter { $0.userID == friendID } }
}

1 个答案:

答案 0 :(得分:2)

如果我理解正确,我认为像这样的查询会做你想要的事情:

func getFriendChatConversationModel(_ friendID: String) -> ChatConversationModel? {
    let realm = try! Realm()
    let chatConversationModels = realm.objects(ChatConversationModel.self).filter("typeIndex = %@", ChatTypes.ChatType.oneToOne.index)
    return chatConversationModels.filter("ANY userAcitivities.userID == %@", friendID).first
}