核心数据合并政策

Posted

技术标签:

【中文标题】核心数据合并政策【英文标题】:Core Data Merge policy 【发布时间】:2018-07-22 10:37:22 【问题描述】:

我已经成功地在我的应用程序中实现了核心数据。一切正常,但我遇到了问题。我正在使用合并策略来更新记录。 我有两个实体名称 IssuesMembers 一对多。一个问题有很多成员。

数据来自服务器并保存在这两个实体中:

Object A
Object B
Object C

此数据首次出现并保存在 coredata 中。服务器上的数据更新,第二次获取时,这个数据来了:

Object A
Object B

它应该更新并删除对象 C,但 对象 C 仍在 coredata 中。 请帮助我在这里做错了什么。提前致谢。

这是我的代码:

private class func getContext() -> NSManagedObjectContext 
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    return appDelegate.persistentContainer.viewContext


class func saveIssues(with json: JSON)

    let context = getContext()
    let entity = NSEntityDescription.entity(forEntityName: "Issues", in: context)
    let issue = NSManagedObject(entity: entity!, insertInto: context) as! Issues

    issue.setValue(json["Id"].stringValue, forKey: "id")
    issue.setValue(json["Name"].stringValue, forKey: "name")
    issue.setValue(json["CreatedByName"].stringValue, forKey:"createdByName")

    for issueMembers in json["Members"].arrayValue
    
       let members = NSEntityDescription.insertNewObject(forEntityName: "Members", into: context) as! Members
        members.setValue(issueMembers["FullName"].stringValue, forKey: "fullName")
        members.setValue(issueMembers["PictureUrl"].stringValue, forKey: "picture_Url")
        members.setValue(issueMembers["LoginId"]. stringValue, forKey: "loginId")
        issue.addToIssueMembers(members)
        


  context.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
   do
        try context.save()
    catch let error as NSError  
        print("Could not save \(error), \(error.userInfo)")
     


【问题讨论】:

添加一些代码来展示你如何处理更新。还要描述您使用的托管对象上下文集(您是否在任何地方设置了父上下文?何时保存上下文?) @AntonFilimonov 我已经编辑了我的问题。请查看我的代码。请帮助我在这里做错了什么。谢谢 我没有看到任何代码可以删除不再需要的对象。您是否使用任何唯一性约束? @AntonFilimonov 我正在使用唯一约束。问题中的“Id”和成员中的“loginId”是唯一约束。 @AntonFilimonov 我认为使用合并策略的目的是不再检查更新、删除。它处理这些操作。 【参考方案1】:

我对其进行了一些调查,发现没有人合并策略适合您的需求:在唯一性约束的情况下,NSRollbackMergePolicyNSOverwriteMergePolicy 都只保存旧的(存在于持久存储中)关系中的对象集,并且NSMergeByPropertyStoreTrumpMergePolicyNSMergeByPropertyObjectTrumpMergePolicy 都保存与对象在两个版本(磁盘和内存中)中的关系的所有对象。所以看起来你必须自己管理这段关系......

【讨论】:

我的应用程序的流向是它每次都从服务器获取最新数据并刷新本地数据库。所以在我的情况下合并策略没有用?因为数据可能每次都不同。那么解决这种情况的最佳方法是什么? @AdnanMajeed 这取决于您的需求。如果对你没问题,你总是得到新对象,我会在创建新对象之前删除旧对象。例如,如果您使用 NSFetchedResultsController 并希望它告诉您现有对象已更改而不是替换为新对象,那么您必须 1. 请求现有对象; 2. 如果不存在,则创建新的。 3.填充对象数据。 4. 对依赖项做同样的事情(也许在依赖项的情况下,你可以删除旧的并创建新的)

以上是关于核心数据合并政策的主要内容,如果未能解决你的问题,请参考以下文章

核心数据合并行为

合并冲突核心数据

核心数据更改不合并

合并 iCloud 和核心数据数据库

在扩展/合并核心数据模型时保留数据

核心数据锁因为合并?