【问题标题】:how to change the existing managerObject in managerObjectContext如何更改 managedObjectContext 中的现有管理器对象
【发布时间】:2013-09-21 23:04:46
【问题描述】:

我认为答案很简单,也许我错过了一些重要的东西!我可以插入一个新对象,我可以从 managerObjectContext 中删除一个对象,我可以通过它的 ID 访问该对象,但我不明白如何更改它!

我的代码很简单:

- (NSManagedObjectContext *)managedObjectContext {
return [(CalcAppDelegate*)[[UIApplication sharedApplication]delegate] managedObjectContext];}


- (void)viewDidLoad {
[super viewDidLoad];

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Materials"];
fetchRequest.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"created" ascending:YES]];

list = [self.managedObjectContext executeFetchRequest:fetchRequest error:nil];

self.navigationItem.rightBarButtonItem = self.editButtonItem;

[tbl reloadData];}

我将数据传递给另一个 ViewController

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

if ([segue.identifier isEqualToString:@"MatListToDetailSegue"]) {
    MaterialsDetailViewController *detailMaterial = segue.destinationViewController;
    detailMaterial.material = [list objectAtIndex:tbl.indexPathForSelectedRow.row];
    detailMaterial.managedObjectId = [[list objectAtIndex:tbl.indexPathForSelectedRow.row] objectID];
}

我想将此 managedObject 保存在 managedObjectContext 中并提交 managedObjectContext ,但我在 SQLite 文件中没有任何更改!

- (IBAction)saveBtn:(id)sender {

material.matName = editMaterialName.text;
material.matWidth = [NSNumber numberWithInt:300];
material.matPrice = [NSNumber numberWithInt:300];

[self.managedObjectContext save:nil];
[self.navigationController popViewControllerAnimated:YES];}

由于未捕获的异常“NSInvalidArgumentException”而终止应用,原因:“+entityForName: nil 不是搜索实体名称“Materials”的合法 NSManagedObjectContext 参数

哇!谢谢你的答案不同马赫!我解决了这个问题。

我需要:从方法 -(IBAction)saveBtn 中删除它

material = (Materials *)[NSEntityDescription entityForName:@"Materials" inManagedObjectContext:managedObjectContext];

并更改 [self.managedObjectContext save:nil];

NSError *error = nil;
if (![self.managedObjectContext save:&error]) {
}

感谢您的提前回复!!!

【问题讨论】:

  • 首先,您没有检查-[NSManagedObjectContext save:] 的返回值,即BOOL。如果它返回NO,则没有保存任何内容。此外,如果它返回NO,您也不会检索错误。修复它,稍后会出现错误消息。
  • 谢谢你,我修好了,现在当我调用方法时出现错误 -(IBAction)saveBtn:(id)sender
  • 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“+entityForName:nil 不是搜索实体名称“材料”的合法 NSManagedObjectContext 参数
  • 创建一个“查找”方法,该方法将从数据库中获取/创建一个新的材质对象,修改该对象并保存到它自己的上下文中。
  • 您确定您有一个名为 Materials 的实体吗?因为这就是异常告诉你的错误。

标签: ios objective-c xcode core-data nsmanagedobjectcontext


【解决方案1】:

等一下,在您的 Material 对象中,您正在分配一个 NSEntityDescription 的实例。我几乎可以肯定这不是你想要的。

这就是你崩溃的原因。当 Core Data 保存时,它会尝试保存您的 Material 对象(期望它是 NSManagedObject 的子类),但您在该内存空间中有一个 NSEntityDescription

另外,您在某处同时使用Materials 和某处Material。这不也是个问题吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多