NSManagedObjectContext 看不到变化(“hasChanges”总是假的)
Posted
技术标签:
【中文标题】NSManagedObjectContext 看不到变化(“hasChanges”总是假的)【英文标题】:NSManagedObjectContext does not see changes ("hasChanges" always false) 【发布时间】:2012-01-11 21:32:56 【问题描述】:我有一个我认为使用核心数据的非常简单的设置:一个NSManagedObjectContext
和两个NSFetchedResultsController
s。该应用有自己的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:撤消保存操作?