【问题标题】:Identifying which fields have changed before CoreData saves在 CoreData 保存之前识别哪些字段已更改
【发布时间】:2011-08-24 00:05:28
【问题描述】:

//设置通知

[[NSNotificationCenter defaultCenter]
 addObserver:self
 selector:@selector(dataChanged:)
 name:NSManagedObjectContextDidSaveNotification
 object:context];    

//稍后

- (void)dataChanged:(NSNotification *)notification{
  NSDictionary *info = notification.userInfo;
  NSSet *insertedObjects = [info objectForKey:NSInsertedObjectsKey];
  NSSet *deletedObjects = [info objectForKey:NSDeletedObjectsKey];
  NSSet *updatedObjects = [info objectForKey:NSUpdatedObjectsKey];

是否可以从 updatedObjects 中确定实际更改了哪些字段?

谢谢, 迈克尔

【问题讨论】:

    标签: ios objective-c core-data nsmanagedobjectcontext


    【解决方案1】:

    以下应该可以解决问题,但您需要使用 NSManagedObjectContextWillSaveNotification 并通过用于保存对象的相同 NSManagedObjectContext 访问更新的对象。

    for(NSManagedObject *obj in updatedObjects){
    
       NSDictionary *changes = [obj changedValues];
       // now process the changes as you need
    
    }
    

    查看 cmets 中的讨论。

    【讨论】:

    • 这很有帮助。谢谢你。经过一些实验,我确定 NSManagedObjectContextDidSaveNotification 的 changedValues 总是为空的,因为这些值已经被保存了。你觉得这对吗?我确实确定如果我使用 NSManagedObjectContextWillSaveNotification,我可以使用返回 NSManagedObjectContext 的 [通知对象]。从那里我可以调用 [context updatedObjects] 并从更新的对象中调用 [obj changedValues],如您所指出的。然后我可以看到如果保存继续,哪些值将发生变化。
    • 是的:您需要访问原始的 NSManagedObjectContext 进行更改才能使其正常工作。
    • @MassimoCafaro 我从“changedValues”方法得到空字典。我有一个实体“Guest”,它与另一个实体“PersonalDetails”具有一对一的关系。如果我在 PersonalDetails 中更改了任何内容,我会在 updatedObjects 中得到“Guest”和“PersonalDetails”,但 changedValues 返回空字典。
    • @iVishal,如 cmets 中所述,您需要使用与修改对象相同的 NSManagedObjectContext 和 NSManagedObjectContextWillSaveNotification。事实上,如果你使用 NSManagedObjectContextDidSaveNotification 并保存对象,一旦保存对象,你就会失去对对象所做的修改。
    猜你喜欢
    • 2020-03-13
    • 2013-07-13
    • 2011-03-23
    • 2012-02-14
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多