保存对NSManagedObject的更改

时间:2012-09-05 20:34:56

标签: xcode nsmanagedobject nsmanagedobjectcontext nsfetchrequest

我在修改ManagedObjects并将这些更改保存到持久存储时遇到问题。

删除对象,插入对象的工作原理是什么。并获取这些对象。如上所述,我无法更改已获取的托管对象。

我有两个视图控制器。 两者都有公共财产:

@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;

AppDelegate.m文件为应用程序中的第一个视图控制器设置此属性:didFinishLaunchingWithOptions:方法如下:

// get reference to view controller //
//..
controller1.managedObjectContext = self.managedObjectContext;

视图controller1在推送到第二个视图控制器时再次传递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中我使用Variables View来关注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 个答案:

答案 0 :(得分:2)

Oke让我回答我自己的问题:作为我的新人,我确实做了一件完全错误的事情。我以为我知道自己比苹果更好。吸取教训:我没有!

在模型中创建实体后,我为每个实体(或实际上每个实体的NSManagedObject子类)创建了自定义托管对象类。 在生成的实现文件中,所有属性(属性)都实现为@dynamic。由于缺乏知识,我不理解/认识到这一点。所以我心中想到的是:让我们把所有这些改为@synthesize。

希望这篇文章可以帮助其他一些新手不会犯同样的错误。