NSManagedObjectContext 看不到变化(“hasChanges”总是假的)

Posted

技术标签:

【中文标题】NSManagedObjectContext 看不到变化(“hasChanges”总是假的)【英文标题】:NSManagedObjectContext does not see changes ("hasChanges" always false) 【发布时间】:2012-01-11 21:32:56 【问题描述】:

我有一个我认为使用核心数据的非常简单的设置:一个NSManagedObjectContext 和两个NSFetchedResultsControllers。该应用有自己的NSManagedObject 子类。

我所做的或多或少如下(伪代码/流程):

1. create an NSFetchRequest
    -> with it an NSFetchedResultsController
       (and attach an NSFetchedResultsControllerDelegate)
2. fetch the objects from the store
3. create another NSFetchRequest (in/from/with the same context)
    -> with it a second NSFetchedResultsController
4. fetch a subset of objects
5. change an object via
    [[[secondFetchedResultsController fetchedObjects] objectAtIndex:0]
            setWhateverSyncedProperty:differentValue]
6. save the NSManagedObjectContext (-> no error)
7. restart app -> changes lost

我认为我在文档中读到的是 a) 第一个 FetchedResultsController 的委托应该得到一个 controller:didChangeObject:atIndexPath:forChangeType:newIndexPath: 事件,并且 b) NSManagedObjectContext 将更改保存到持久存储。这一切都没有发生。

我还希望 NSManagedObjectContext 在保存之前“看到”更改,即当我在其上调用“hasChanges”时返回 YES。它不是。这可能也是不将任何内容保存到持久存储的原因:它认为没有任何更改。

奇怪的是,当我“NSLog”上下文的内容时,我看到了 changed 对象。所以变化是在记忆中...

最后但同样重要的是:调用时

[[self managedObjectContext] refreshObject:[[[self fetchedResultsController] fetchedObjects] objectAtIndex:2] mergeChanges:YES];

代理收到didChangeObject-消息!

我感觉这可能与NSManagedObjectContext Class Reference 中 hasChanges 下的“键值相关说明”有关,但我猜我不理解这个概念。

非常感谢任何想法和/或提示。

顺便说一句:我在 iPhone 模拟器和 XCode 3.2.5 上。

【问题讨论】:

只是一个想法:我遇到了类似的问题。事实证明,我在启动时正在做一些数据库初始化,但这个过程并没有按照我想象的顺序发生。如果您认为有任何其他插入或删除与此问题无关,您可能需要重新评估。 嗯 - 感谢您的意见。但不幸的是,没有,我将其剥离为没有其他数据操作。无济于事... 我正在使用 MagicalRecord,但我遇到了同样的问题,因为我在保存和编辑时使用了不同的 NSManagedObjectContext 对象。当然,我们应该看到 NSManagedObjectContext 对象的偏移量(打印输出) 【参考方案1】:

确保您对您的NSManagedObjectContext 有强烈的引用。听起来您正在丢失上下文,并且托管对象丢失了它们的上下文。这可以解释没有保存更改的原因。

【讨论】:

不确定我是否理解您的意思。我可以“NSLog”上下文并查看更改的对象......所以上下文似乎在那里。这不是说我有参考吗?我还通过保留属性获取上下文。 如果您将 NSManagedObjectContext 存储在静态或 ivar 中并保留它,那么您就有了对它的引用。你应该很好。检查您是否有多个上下文。也许您在一个上下文中更改对象并保存另一个?您可以通过其-managedObjectContext 方法查看对象所处的上下文。【参考方案2】:

我以前也遇到过。确保您的属性是 @dynamic 而不是 @synthesize

【讨论】:

以上是关于NSManagedObjectContext 看不到变化(“hasChanges”总是假的)的主要内容,如果未能解决你的问题,请参考以下文章

父/子 NSManagedObjectContext 不起作用

NSManagedObjectContext:自动更新与否?

NSManagedObjectContext:撤消保存操作?

声明 NSManagedObjectContext 时出错

CoreData 多 NSManagedObjectContext 保存通知说明

NSManagedObjectContext 类别