【问题标题】:ObjectMapper + Realm + AlamofireObjectMapper + 领域 + Alamofire
【发布时间】:2016-09-20 18:16:11
【问题描述】:

我使用由 Alamofire 交付的 ObjectMapper 映射我的对象并将它们保存在 Realm 中。

一切正常。但是如何删除 Realm 中存在但已在我的 Web 服务中删除的对象?

更新:根据下面的答案,我目前以这段代码结束:

 if let overviewItemsArray = response.result.value{

                    do{
                        try self.realm.write{
                            self.realm.delete(self.realm.objects(OverviewItem))
                            self.realm.add(overviewItemsArray, update: true)
                        }
                    }
                    catch let err as NSError {
                        logger.error("Error with realm: \(err.localizedDescription)")
                    }
                    overviewItemsAsList.removeAll()
                    overviewItemsAsList.appendContentsOf(self.realm.objects(OverviewItem)
                        .sorted("sortOrder", ascending: true))
                    successHandler(overviewItemsAsList)
                }

也许有人进一步输入了如何改进这一点。我有 10 个这种类型的对象。但在其他对象上,我得到 1500 个项目。

【问题讨论】:

    标签: swift realm alamofire objectmapper


    【解决方案1】:

    我终于弄明白了,而且效果很好。我计算缓存数据和新数据的差异并删除它:

    private func deleteOrphans(existingData: List<VotingHeader>, fetchedData:[VotingHeader]){
    
            guard existingData.count>0 else {
                return
            }
    
            let existingIDs = Set(existingData.map({$0.votingID}))
            let incomingIDs = fetchedData.map({$0.votingID})
            let idsToDelete = existingIDs.subtract(incomingIDs)
    
            if idsToDelete.count>0{
                let itemsToDelete =  self.realm.objects(VotingHeader).filter("votingID IN %@",idsToDelete)
    
                try! self.realm.write{
                    self.realm.delete(itemsToDelete)
                }
            }
        }
    

    【讨论】:

      【解决方案2】:

      这听起来像是您需要实现某种机制来确定在服务器上删除了哪些对象,并将该信息明确地转发到您的本地设备以反映该更改。我能想到几个可能的解决方案:

      • 如果您可以控制 API,您可以实现一个系统,您的设备会告诉服务器上次调用 API 的时间戳,然后服务器可以在其响应中返回 ID 号列表在那之后被删除的条目。

      • 如果您只是每次都下载相同的列表,而不是每次都删除 Realm 文件中的所有内容,请手动循环遍历 Realm 文件中的每个条目,看看它是否在下载的列表。如果没有,请删除它。当然,这仍然是一个相对较慢的操作,但它比每次删除/重新创建所有内容要快得多。

      • 1234563服务器。

      希望对你有帮助!

      【讨论】:

        【解决方案3】:

        你可以:

        -使用 updated_at 字段并通过 id 更新该字段,然后删除所有尚未更新的对象或

        -删除所有对象,然后插入新对象(昂贵,我不会这样做)

        我认为你应该选择第一个选项,特别是如果你有很多数据,当你从 Web 服务获得响应时,通过每个选项并使用 NSDate() 更新数据库中的相应记录,然后删除对象是“老”。请注意,这不是来自服务器的 updated_at 而是您的本地存储。

        如果您的数据量很小,并且您确信它会快速且便宜,那么另一个很好。

        【讨论】:

        • 其中一个框架没有解决方案吗?也许是 Objectmapper?
        • 我不认为有,但也许有人知道更好的方法。编辑可能会出现类似的问题:您要采取哪一方:) 对于 1500 条记录,我建议您在领域对象中使用此 updated_at 字段。
        猜你喜欢
        • 2016-06-12
        • 2016-02-02
        • 1970-01-01
        • 2023-03-14
        • 2017-08-21
        • 2016-02-21
        • 1970-01-01
        • 2020-11-27
        • 1970-01-01
        相关资源
        最近更新 更多