保存对 NSManagedObject 的更改
Posted
技术标签:
【中文标题】保存对 NSManagedObject 的更改【英文标题】:Saving changes to a NSManagedObject 【发布时间】:2012-09-05 20:34:55 【问题描述】:我在对 ManagedObjects 进行更改并将这些更改保存到持久存储时遇到问题。
起作用的是删除对象,插入对象。并获取这些对象。如前所述,我无法对获取的托管对象进行更改。
我有两个视图控制器。 两者都有公共财产:
@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;
AppDelegate.m 文件为应用程序中的第一个视图控制器设置此属性:didFinishLaunchingWithOptions: 方法如下:
// get reference to view controller //
//..
controller1.managedObjectContext = self.managedObjectContext;
视图控制器 1 在推送到第二个视图控制器时再次传递 managedObjectContext,它在 prepareForSegue: 方法中执行此操作,如下所示:
// Get reference to the detail view //
MySecondViewController *controller2 = segue.destinationViewController;
// Pass the managed object context //
controller2.managedObjectContext = self.managedObjectContext;
在第二个视图控制器中,我从核心数据中获取对象并将它们存储在视图控制器的属性中,如下所示:
@property (nonatomic, strong) MyKindOfObject *object;
...
self.object = [fetchResults lastObject];
获取对象似乎工作正常,因为我很好地得到了结果..
获取的对象有许多属性,其中一个是 NSString 类型。我在 UITextField 中显示的此属性的值。用户可以在此处更改值,完成后按下按钮。我捕捉到动作并执行以下操作:
self.object.mytext = textField.text;
然后尝试保存到核心数据:
// Save to CoreData //
NSError *error = nil;
if(![self.managedObjectContext save:&error])
// handle the error //
NSLog(@"is error");
else
NSLog(@"no error");
1) 下次用户返回此视图控制器时,将再次获取该对象。但它仍然具有旧值。
2) 我还使用一个名为 SQLite Manager 的 Firefox 插件来关注相关 sqlite 文件中的数据。单步执行代码时,调用 save 方法后文件中没有任何变化。
3) 同样在 Xcode 中,我使用变量视图来关注 self.managedObjectContext 对象。当我将新数据存储到我的对象中时,就在调用 save 之前,self.managedObjectContext 的所有属性都没有改变(如 unprocessedChanges 或 changedObjects)。
4) 我还添加了对 managedObjectContext 的 hasChanges 方法的调用,但这返回 NO:
if([self.managedObjectContext hasChanges])
NSLog(@"changes managed object context!");
5)我还添加了对相关 managedObject 的 hasChanges 方法的调用,但这也返回 NO:
if([self.object hasChanges])
NSLog(@"changes in managed object!");
我可能在这里做错了什么,但我不知道它是什么。 我真的希望有人可以帮助我吗? 提前致谢!
【问题讨论】:
【参考方案1】:好吧,让我回答一下我自己的问题:作为新手,我确实做了一些完全错误的事情。我在想我比苹果自己更了解。经验教训:我没有!
在模型中创建实体后,我为每个实体创建了自定义托管对象类(或者实际上是每个实体的 NSManagedObject 子类)。 在生成的实现文件中,所有属性(属性)都被实现为@dynamic。由于缺乏知识,我不理解/认识到这一点。所以我心中的新手想:让我们把它全部改成@synthesize。
希望这篇文章可以帮助其他新手不要犯同样的错误。
【讨论】:
我犯了这个错误。现在在大约 4 小时未经过滤的愤怒后纠正了它,一切都恢复正常了。布拉贝尔达斯我爱你。以上是关于保存对 NSManagedObject 的更改的主要内容,如果未能解决你的问题,请参考以下文章
ios核心数据:如何更改NSManagedObject而不将其保存到上下文中
我们可以保存一个特定的 NSManagedObject 吗?