1

我在对 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!");
}

我可能在这里做错了什么,但我不知道它是什么。我真的希望有人可以帮助我吗?提前致谢!

4

1 回答 1

2

好吧,让我回答我自己的问题:作为新手,我确实做了一些完全错误的事情。我在想我比苹果自己更了解。教训:我没有!

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

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

于 2012-09-06T10:00:42.373 回答