【问题标题】:How to remove all models that are not contained in the current array in Realm如何删除Realm中当前数组中不包含的所有模型
【发布时间】:2017-06-17 04:44:12
【问题描述】:

我有以下情况,我在加载应用程序时获取数据,它是ChatUserPersonalConversationModel模型的数组,我将这个数组作为单独的模型存储在Realm中。当我得到一个数组并且如果以前的模型不包含在结果数组中时,执行以下操作的最佳方法是什么,那么我将它从 Realm 中删除。

我写了以下代码,它对我有用,但我认为它可以做得更好。

 func updateChatUserPersonalConversationModels(_ chatUserPersonalConversationModels: [ChatUserPersonalConversationModel]) {
        DispatchQueue.main.async {
            do {
                let realm = try Realm()
                let existChatUserPersonalConversationModels = realm.objects(ChatUserPersonalConversationModel.self)

                for existChatUserPersonalConversationModel in existChatUserPersonalConversationModels {
                    if !chatUserPersonalConversationModels.contains(where: { (newChatUserPersonalConversationModel) -> Bool in
                        return newChatUserPersonalConversationModel.id == existChatUserPersonalConversationModel.id
                    }) {
                        try realm.write {
                            realm.delete(existChatUserPersonalConversationModel)
                        }
                    }
                }

                try realm.write {
                    realm.add(chatUserPersonalConversationModels, update: true)
                }
            } catch {
                debugPrint(error.localizedDescription)
            }
        }
    }

【问题讨论】:

    标签: ios arrays swift realm


    【解决方案1】:

    Realm 没有任何内置功能来实现您想要的。您所拥有的另一种方法是利用 Swift 的 Set 类型。

    首先,您应该确保为您的模型类定义了相等性和哈希值属性,并且您可能应该有一个主键(似乎是id)。

    接下来,将现有和新模型的数组转换为 Sets。 Set 有一个初始化器,它接受任何对象序列,因此您可以将数组和 Realm Lists 传递给它。

    接下来,使用Set 上的subtract(_:) 方法获取一个仅包含您要删除的元素的新集合:

    // itemsToDelete contains models in oldModels that aren't in newModels
    let itemsToDelete = oldModels.subtract(newModels)
    

    最后,您可以使用 Realm delete(_:) 方法,该方法需要一个序列来一次删除所有过时的模型:

    try! realm.write {
        realm.delete(itemsToDelete)
    }
    

    我希望这会有所帮助。请注意,这不是灵丹妙药。如果您的数组很大,您可能需要考虑这种方法是否使用太多内存。

    【讨论】:

    • 这对我有用,我只需要在我的模型上覆盖 isEqual
    猜你喜欢
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 2015-02-01
    • 2022-01-16
    • 2013-11-26
    • 2018-02-02
    相关资源
    最近更新 更多