【发布时间】:2011-03-20 17:36:28
【问题描述】:
我在我的 iPhone 应用程序中使用核心数据。我创建了一个简单的类 Friend,它派生自 NSManagedObject,并使用以下属性:
@property (nonatomic, retain) NSString *name;
我可以在我的上下文中添加和删除此类的实例,并且我的更改也是持久的。
现在我想更新/修改一个 Friend-实例并使其再次持久化。
但这似乎不起作用。
这是显示我的问题的一段代码:
// 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]) { ... }
在评论 1 中,一切都很好。我得到了一个 Friend 类型的新 NSManagedObject,我可以更改 name 属性。上下文告诉我有一些东西可以保存。 保存上下文后,我看到 context.hasChanges == 0。另请注意,数据在保存上下文后是持久的。
在评论 2 之后,我更改了 name 属性。现在我希望 context.hasChanges == 1 并且在 context save 之后我希望新名称是持久的。 但不幸的是它不是。再次启动应用程序,使用 name-property = @"name1" 加载 Friend 实例。
我在核心数据文档中找不到任何提示或示例。那么我做错了什么? 我需要做什么来更新/修改现有的Friend-实例并使其持久化?
我看到的唯一解决方案是删除条目,更改它,然后再次添加。但我认为这不是正确的方法。
谢谢!
【问题讨论】:
-
顺便说一句,您不需要强制转换为您的
Friend对象。由于-insertNewObjectForEntityForName: inManagedObjectContext:返回一个 id,您可以简单地将其分配给 Friend*。在 Objective-C 中,99.9% 的时间都不需要强制转换。 -
感谢您的提示,马库斯。你当然是对的。那是因为我还是不习惯objective-c。
标签: iphone core-data nsmanagedobject nsmanagedobjectcontext