【问题标题】:How can I get the entities changed when the context is saved in Core Data?将上下文保存在 Core Data 中时,如何更改实体?
【发布时间】:2012-01-15 13:26:49
【问题描述】:

我正在使用名为 NSManagedObjectContextDidSaveNotification 的通知,当它收到通知时,userInfo 字典包含在保存期间刚刚对上下文所做的所有更改。如何将该数据外推到我的托管对象模型中?我试过这样做

- (void)addControllerContextDidSave:(NSNotification*)saveNotification {

    NSMutableDictionary *userInfo = (NSMutableDictionary *)[saveNotification userInfo];
    NSLog(@"userInfo is %@", userInfo);
    TaskInfo *taskInfo = (TaskInfo *)[userInfo objectForKey:@"inserted"];
    NSLog(@"taskInfo is %@", taskInfo);
}

TaskInfo 是我的自定义托管对象模型。并打印了这个

    userInfo is {
        inserted = "{(\n    <TaskInfo: 0x15f350> (entity: TaskInfo; id: 0x13fda0 <x-       coredata://1F98E14E-259F-4CB3-84E2-9AC8466CCD1B/TaskInfo/p2> ; data: {\n    completionDate = nil;\n    creationDate = \"2011-12-08 02:14:04 +0000\";\n    duration = 10860;\n    elapsedTime = 0;\n    isCompleted = 0;\n    isRepeating = 0;\n    isRunning = 0;\n    isToday = 0;\n    projectedEndTime = nil;\n    specifics = nil;\n    startTime = nil;\n    timesReminded = 0;\n    title = haha;\n})\n)}";
        updated = "{(\n)}";
    }
    2011-12-07 20:14:54.147 Tisk Task 3[3161:707] taskInfo is {(
        <TaskInfo: 0x15f350> (entity: TaskInfo; id: 0x13fda0 <x-coredata://1F98E14E-259F-    4CB3-84E2-9AC8466CCD1B/TaskInfo/p2> ; data: {
        completionDate = nil;
        creationDate = "2011-12-08 02:14:04 +0000";
        duration = 10860;
        elapsedTime = 0;
        isCompleted = 0;
        isRepeating = 0;
        isRunning = 0;
        isToday = 0;
        projectedEndTime = nil;
        specifics = nil;
        startTime = nil;
        timesReminded = 0;
        title = haha;
    })
    )}

我认为问题在于 TaskInfo 模型之外的额外 {()} 集。有人有什么建议吗?

【问题讨论】:

    标签: iphone objective-c ios core-data


    【解决方案1】:

    所以我最终找到了解决我自己问题的方法,方法是在任务的 objectID 保存在 AddViewController 委托之前找到它,并将其传递给我在通知中使用的主表视图。比尝试解析NSManagedObjectContextDidSaveNotification 的userInfo 字典中的更改日志要容易得多。

    【讨论】:

      【解决方案2】:

      外部的 {()} 告诉您 [userInfo objectForKey:@"inserted"] 实际上返回一个包含单个 TaskInfo 的 NSSet,而不是 TaskInfo 本身。

      我不确定您所说的“将该数据外推到我的托管对象模型中”究竟是什么意思,但如果它的意思是“更新另一个 NSManagedObjectContext 以便那些新保存的更改出现在其中”,那么有一种更简单的方法:

      查看手册中的mergeChangesFromContextDidSaveNotification:。它需要由上下文 A 触发的 NSManagedObjectContextDidSaveNotification,并将刚刚保存的所有更改放入上下文 B。无需查看通知的 userInfo。

      【讨论】:

      • 我总是一次添加一个对象,所以我希望我可以直接访问此刻正在添加的实体。有没有合理的方法来做到这一点?一旦该实体在上下文 B 中(假设它来自 A),我就必须搜索上下文并获取对象,对吗?但我已经知道任务是什么,所以我只想直接访问它。
      • 在这种情况下,在执行 mergeChangesFromContextDidSaveNotification 之后,为 objectID 搜索通知用户信息可能是合理的,并通过 ID 向您的上下文询问对象。这样您就可以获得与正确上下文关联的对象。从您最初的问题中得出的结论是,通知 userinfo 始终包含一组对象,即使只有一个。
      • 好的,谢谢。我会试试的。我将如何提取该 ID?我为objective-c做了很少的字符串工作。如果你知道一个好的网站,那就更好了。感谢您迄今为止的帮助。
      • NSManagedObject 上的 objectID 方法返回对象的主键。它不是字符串,但它有一个 URL 形式,如果您需要(您不需要)可以进行字符串化。请参阅 stackoverflow.com/questions/5035057 了解如何使用它们来加载对象。
      • 不,我明白。我的意思是如何从那个 NSSet 中取出它?
      猜你喜欢
      • 2012-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-24
      • 1970-01-01
      相关资源
      最近更新 更多