领域对象谓词过滤器无效

时间:2017-11-21 07:02:02

标签: swift realm predicate

我使用谓词来过滤模型的转换。我使用Realm过滤器得到了错误的结果(0个模型虽然应该有一个)。在那之后,我做了另一张检查,她告诉我有一个模型符合这些标准。请告诉我这里可能有什么问题。

let checkConversations = Array(realm.objects(ChatConversationModel.self)).filter({ $0.lastMessage != nil && $0.toDelete == false })
    debugPrint("checkConversations", checkConversations.count) received one model (this is the right result).

    var conversations = Array(realm.objects(ChatConversationModel.self).filter("lastMessage != nil && toDelete == false"))

    debugPrint("conversations", conversations.count) I did not receive any models at all

型号:

class ChatConversationModel: Object, Mappable {

    /// oneToOne = friend
    enum ChatType {
        case oneToOne, group, nonFriend

        var index: Int {
            switch self {
            case .oneToOne:
                return 0
            case .group:
                return 1
            case .nonFriend:
                return 2
            }
        }
    }

    @objc dynamic var id = ""
    @objc dynamic var typeIndex = ChatType.oneToOne.index
    @objc dynamic var lastMessage: ChatMessageRealmModel?
    @objc dynamic var lastActivityTimeStamp = 0.0
    @objc dynamic var modelVersion = AppStaticSettings.versionNumber
    let createTimestamp = RealmOptional<Double>()

    // for group chat
    @objc dynamic var groupConversationOwnerID: String?

    /// for group chat equal card photos
    @objc dynamic var cardInfo: ChatConversationCardInfoModel?

    // Local
    @objc dynamic var toDelete = false

    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"]
            lastMessage <- map["lastMessage"]
            lastActivityTimeStamp <- map["lastActivityTimeStamp"]
            createTimestamp.value <- map["createTimestamp"]
            modelVersion <- map["modelVersion"]
            // for group chat
            cardInfo <- map["cardInfo"]
            groupConversationOwnerID <- map["groupConversationOwnerID"]
        } else {
            id >>> map["id"]
            typeIndex >>> map["typeIndex"]
            lastMessage >>> map["lastMessage"]
            lastActivityTimeStamp >>> map["lastActivityTimeStamp"]
            createTimestamp.value >>> map["createTimestamp"]
            modelVersion >>> map["modelVersion"]
            // for group chat
            cardInfo >>> map["cardInfo"]
            groupConversationOwnerID >>> map["groupConversationOwnerID"]
        }
    }

}

更新:当我收到实际会话时,我会开始比较应用程序中已存在的会话。并寻找不在结果中的id。接下来,我发现这些不相关的对话并将delete = false,以便安全地#34;删除非活动对话。由于我收听了Realm开发人员之一的播客,他建议不要删除可以使用的对象。因为在接收带有后端的结果时,任何非活动对话都可以再次激活,所以我选择了这种方法。您可以查看这些功能的代码。

private func syncNewConversations(_ conversations: [ChatConversationModel], userConversations: [ChatUserPersonalConversationModel], completion: ((_ error: Error?) -> Void)?) {
        DispatchQueue.global(qos: .background).async {
            let userConversationsIDs = userConversations.map { $0.id }
            DispatchQueue.main.async {
                do {
                    let realm = try Realm()
                    let userConversationPredicate = NSPredicate(format: "NOT id IN %@", userConversationsIDs)
                    let notActualUserConversations = realm.objects(ChatUserPersonalConversationModel.self).filter(userConversationPredicate)

                    let filteredNotActualUserConversations = Array(notActualUserConversations.filter({ $0.lastActivityTimeStamp < $0.removedChatTimeStamp }))

                    let notActualConversationIDs = filteredNotActualUserConversations.map { $0.id }

                    let notActualConversationPredicate = NSPredicate(format: "id IN %@", notActualConversationIDs)
                    let notActualConversations = realm.objects(ChatConversationModel.self).filter(notActualConversationPredicate)

                    let notActualMessagesPredicate = NSPredicate(format: "conversationID IN %@", notActualConversationIDs)
                    let notActualMessages = realm.objects(ChatMessageRealmModel.self).filter(notActualMessagesPredicate)

                    try realm.write {
                        realm.add(userConversations, update: true)
                        realm.add(conversations, update: true)
                        for notActualUserConversation in notActualUserConversations {
                            notActualUserConversation.toDelete = true
                        }
                        for notActualConversation in notActualConversations {
                            notActualConversation.toDelete = true
                        }
                        for notActualMessage in notActualMessages {
                            notActualMessage.toDelete = true
                        }
                        completion?(nil)
                    }
                } catch {
                    debugPrint(error.localizedDescription)
                    completion?(error)
                }
            }
        }
    }

0 个答案:

没有答案