我使用ObjectMapper映射我的对象,这些对象由Alamofire提供,并将它们保存在Realm中。
Everthing工作正常。但是,如何删除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件物品。
答案 0 :(得分: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)
}
}
}
答案 1 :(得分:0)
你可以:
- 使用updated_at字段并通过id更新该字段,之后删除所有尚未更新的对象或
- 删除所有对象,然后插入新对象(昂贵,我不会做这样的事情)
我认为您应该选择第一个选项,特别是如果您有大量数据,当您从Web服务获得响应时,通过每个选项并使用NSDate()更新数据库中的相应记录,然后删除对象是“老”。请注意,这不是来自服务器的updated_at,而是您的本地存储。
如果您拥有少量数据并且您确信它会快速便宜,那么另一个就没问题了。
答案 2 :(得分:0)
这听起来像你需要实现某种机制来确定哪些对象在服务器上被删除,并明确地将这些信息转发给你的本地设备以反映这种变化。我可以想到一些可能的解决方案:
如果您可以控制API,则可以实现一个系统,其中您的设备告诉服务器上次调用API的时间戳,然后服务器可以在其响应中返回ID号列表对于在此之后删除的条目。
如果您每次只是简单地下载相同的列表,而不是每次都清除Realm文件中的所有内容,请执行Realm文件中每个条目的手动循环,看看它是否有相应的下载列表中的条目。如果没有,删除它。当然,这仍然是一个相对较慢的操作,但它比每次删除/重新创建所有内容要快得多。
由于听起来Realm在这里用于缓存服务器信息,你可以在Realm对象上设置一个非常严格的到期时间,如果超出它就会删除它们,或者如果从中刷新对象则扩展它服务器。
我希望有所帮助!