将NSManagedObject的实例添加到NSManagedObjectContext ok,更新同一实例失败

Zen*_*ula 4 iphone core-data nsmanagedobject nsmanagedobjectcontext

我在我的iPhone应用程序中使用核心数据.我创建了一个简单的类Friend,它派生自NSManagedObject并使用以下属性:

@property (nonatomic, retain) NSString *name;
Run Code Online (Sandbox Code Playgroud)

我能够在我的上下文中添加和删除此类的实例,并且我的更改也是持久的.
现在我想更新/修改一个Friend -instance并让它再次持久化.

但这似乎不起作用.

这是一段显示我的问题的代码:

//  NSManagedObjectContext *context  = < my managed context> 
//   NSFetchedResultsController *nsfrc= < my fetched result controller>

NSEntityDescription *entity = [nsfrc entity];
NSManagedObject *newManagedObject = [NSEntityDescription 
       insertNewObjectForEntityForName:[entity name]  inManagedObjectContext:context];

Friend *f = (Friend *) newManagedObject;
f.name = @"name1";
//1.  --- here context.hasChanges == 1 ---   ok

NSError *error = nil;
if (![context save:&error]) { ... }
//2.  --- here context.hasChanges == 0 ---   ok

f.name = @"name2";
//3.  --- here context.hasChanges == 0 ---   nok?

if (![context save:&error]) { ... }
Run Code Online (Sandbox Code Playgroud)

评论1一切都很好.我得到了一个新的朋友类型的NSManagedObject,我可以更改名称属性.上下文告诉我有一些东西需要保存.保存上下文后,我看到context.hasChanges == 0.另请注意,保存上下文后数据是持久的.

评论2之后,我更改了name属性.现在我希望context.hasChanges == 1并且在上下文保存之后我希望新名称是持久的.但不幸的是,事实并非如此.再次启动应用程序,使用name-property = @"name1"加载Friend实例.

我在核心数据文档中找不到任何提示或示例.那么我做错了什么?我需要做些什么来更新/修改现有的Friend -instance并使其持久化?

我看到的唯一解决方案是删除条目,更改它,然后重新添加.但我不认为这是正确的方法.

谢谢!

Mar*_*ett 5

无法识别更改可能是由于您在子类实现中使用@synthesize而不是@dynamic.CD提供了自己的访问器,您可以使用@synthesize Martin绕过它们