1

对ManagedObjects进行更改并将这些更改保存到持久存储区时遇到问题。保存对NSManagedObject的更改

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

我有两个视图控制器。 两者都有一个公共属性:

@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方法的调用,但是这也退货否:

if([self.object hasChanges]){ 
    NSLog(@"changes in managed object!"); 
} 

我可能在这里做了一些完全错误的事情,但我无法弄清楚它是什么。 我真的希望有人能帮助我吗? 在此先感谢!

回答

1

奥克让我回答我自己的问题:作为我的新手,我确实做了一件完全错误的事情。我以为自己知道自己比苹果更好。经验教训:我不知道!

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

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

+2

我犯了这个错误。现在经过大约4小时未经过滤的愤怒,现在纠正了它,一切都恢复正常。 Brabbeldas我爱你。 –