保存上下文不会保留更新的 NSManagedObject

Posted

技术标签:

【中文标题】保存上下文不会保留更新的 NSManagedObject【英文标题】:Saving the context does not persist an updated NSManagedObject 【发布时间】:2014-01-12 09:45:26 【问题描述】:

在我的应用中,我有 2 个详细视图控制器:

产品名称更新控制器 产品属性更新控制器

产品属性更新视图控制器中一​​切都很好,没有任何问题。

产品名称更新视图控制器中,但是保存上下文不会给出任何错误。我看到根视图控制器中的产品名称发生了变化,但是当我重新打开我的应用程序时,产品名称向我显示了旧名称。所以它不会被持久化。

根据我的updateProduct方法,我的问题是什么:

-(void)updateProduct:(id)sender
 
AppDelegate *delegate = [UIApplication sharedApplication].delegate;
NSManagedObjectContext *context = [delegate managedObjectContext];

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Products" inManagedObjectContext:context]];

NSError *error = nil;

NSPredicate *predicateID =[NSPredicate predicateWithFormat:@"productID==%d",[secim intValue]];
[request setPredicate:predicateID];

NSArray *myobj=[context executeFetchRequest:request error:&error];
NSManagedObject *prod1=[myobj objectAtIndex:0];

[prod1 setValue:textProduct1.text forKey:@"productName"];



if (![context save:&error]) 
    NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);



[self.navigationController popToRootViewControllerAnimated:YES];

NSLog(@"Data saved");

【问题讨论】:

您的 AppDelegate 代码无关紧要。请从问题中删除它。 同时检查 'prod1' 是一个有效的对象 【参考方案1】:

除了@Mundi,您还可以执行以下操作

NSArray *myobj = [context executeFetchRequest:request error:&error];
NSManagedObject *prod1 = [myobj objectAtIndex:0];

但您没有检查error,也没有检查myobj 是否包含元素。

总是检查是否有错误,但有可能出现错误。

【讨论】:

我认为没有错误,但要确定如果您告诉我如何检查是否有错误以及我也会写的消息是什么。但正如我在调试代码之前所说的,在上下文中一切看起来都很好。如果我在更新方法成功完成后停止 Xcode,然后再次运行我的代码,数据就会变旧。所以问题是上下文没有将我的数据保存到我认为的数据库或磁盘中 @ercan 你确定prod1 有效吗? 有效是什么意思?你能提供更多细节吗? @ercan 你确定在setValue:forKey 之前和之后obj 已经正确改变了吗?前后放一个日志来验证一下。 好的,我找不到我之前和之后写的内容,但我在 Firefox 中打开了 sqlite。并看到上下文保存后数据没有更改,因此它执行上下文保存但无法写入 .sqlite 文件【参考方案2】:

如果您的 updateProduct 方法被调用,请检查断点。我怀疑不是。

根据其他讨论,确保

托管对象上下文不是nil prod1(托管对象)不是nil

您可以使用调试器中的断点或使用日志语句来执行此操作。

【讨论】:

当我调试它进入 updateProduct 方法并成功完成的代码时,它返回到 rootviewcontroller 和 rootviewcontroller 中显示的更新数据但是当我从 Xcode 停止模拟器并再次绑定它时数据返回到旧的。我认为它保存到上下文而不是数据库或磁盘 用进一步的说明更新了我的答案。

以上是关于保存上下文不会保留更新的 NSManagedObject的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 不会将属性更新保留到数据库

应用更新 CoreData 保存了吗?

即使在 Core Data 上下文保存后数据也没有保留

选项卡栏应用程序更新实体中的共享托管对象上下文不会传播到其他选项卡

要保存在服务器中的核心数据的唯一 ID

EBeans 更新不保存更改的字段项