将新对象插入 coreData

Posted

技术标签:

【中文标题】将新对象插入 coreData【英文标题】:insertNewObject into coreData 【发布时间】:2012-04-26 23:34:15 【问题描述】:

我正在尝试将 NSData 对象插入 CoreData,因此我不得不在事后将所有内容添加到我的应用程序中,因为我从未在选择 coredata 的情况下启动它。没关系,因为我已经开始了一个新项目并复制了所有适当的代码以进行所有设置。

我现在正在尝试设置 insertNewObject 方法。然而,这给了我一些问题。

我首先尝试从像这样的另一种方法传递一些 NSData

[self insertNewObject:myData];

然后我正在使用这样的 insertNewObject 方法

- (void)insertNewObject:(id)sender

    NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
    NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];
    NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:@"Entity" inManagedObjectContext:context];

    // If appropriate, configure the new managed object.
    // Normally you should use accessor methods, but using KVC here avoids the need to add a custom class to the template.
    [newManagedObject setValue:sender forKey:@"manufacturers"]; //not sure if this is correct, but sender has myData, and @"manufactures" is the attribute of my entity.

    // Save the context.
    NSError *error = nil;
    if (![context save:&error]) 
        // Replace this implementation with code to handle the error appropriately.
        // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    

从这里发生的情况是,当线程太多时,第三行“NSManagedObject *newManagedObject ...”应用程序崩溃并且我收到此错误

> 2012-04-27 11:18:21.579 thecode[1452:fb03] *** Terminating app due to
> uncaught exception 'NSInternalInconsistencyException', reason:
> '+entityForName: could not locate an NSManagedObjectModel for entity
> name 'Entity''
> *** First throw call stack: (0x14b5022 0x1952cd6 0x61d47 0xa8102 0x1a595 0x199a4 0x18b99 0x15097 0x1136a49 0x1134e84 0x1135ea7
> 0x1134e3f 0x1134fc5 0x1079f5a 0x1c02a39 0x1ccf596 0x1bf9120 0x1ccf117
> 0x1bf8fbf 0x148994f 0x13ecb43 0x13ec424 0x13ebd84 0x13ebc9b 0x215b7d8
> 0x215b88a 0x733626 0x762d 0x1c75 0x1) terminate called throwing an
> exception

我已经在我的 xcdatamodeld 中设置了所需的实体和属性

任何帮助将不胜感激。

【问题讨论】:

请看这里。它可能会帮助你。 ***.com/questions/10082491/… 【参考方案1】:

我不知道您的 CoreData 模型,但我猜您没有名称为“Entity”的实体,因此当您尝试在此处插入名称为“Entity”的新实体时,这可能会导致崩溃:

[NSEntityDescription insertNewObjectForEntityForName:@"Entity" inManagedObjectContext:context];

当您在上面一行获取实体描述但以后不再使用它时,我猜您正在尝试插入此实体。所以你要做的基本上是:

    [NSEntityDescription insertNewObjectForEntityForName:entity.name inManagedObjectContext:context];

希望这会有所帮助!

【讨论】:

我仍然遇到同样的错误,所以我记录了实体以查看其持有的值,我得到的只是 null 所以不确定那里发生了什么。我所有的核心数据模型是一个名为 Manu 的实体,其属性名为 Balls :) 也许你可以试试: NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:@"Manu" inManagedObjectContext:context];这应该给你一个有效的 CoreData 对象。 很遗憾没有。我在想也许我的班级看不到我的对象模型......如果我得到空值,即使我用硬线连接它仍然看不到它,那么我在应用程序委托或其他东西中可能错过了一些东西。 .. ?【参考方案2】:

还要检查您的 managedObjectContext 是否不为零。当它出现时,你会得到这个错误。当您实例化 fetchedResultsController 时,您将 NSManagedObjectContext 与它相关联。你从哪里得到的上下文?

如果这是在您深入研究的视图控制器中,请确保您将 managedObjectContext 从应用委托传递到每个后续控制器,以便他们都可以访问它。然后,您可以将其正确传递给 fetchedResultsController。

【讨论】:

它绝对为零,我已经尝试将它记录到控制台。我不确定我在哪里实例化它我认为可能在应用程序委托中,我必须看看。但我试图在 nsobject 类中使用它。所以与视图等无关。谢谢你的回复,我开始认为我将不得不放弃我的整个项目并重新开始。 我在标头中声明了一个** NSManagedObjectContext managedObjectContext;* 对象,然后在.m 文件中合成它.. 但是当我合成它时我会这样做 @synthesize managedObjectContext = __managedObjectContext; 我认为在我的应用委托中声明了 __managedObjectContext ... 你说的是对象?如果我理解正确,您仍然需要将 managedObjectConext 从应用程序委托或您正在创建的其他任何地方传递给对象。如果您在应用程序委托中处理类似 myObject.managedObjectContext = self.managedObjectContext 的东西 酷,我会在现在/周末之前给它,让你知道我是怎么得到的。我有点理解你,但我不知道在哪里或如何做到这一点。我的大脑完全糊状了。 当我使用 synthesize managedObjectContext = _managedObjectContext; 应用程序委托创建和初始化 _managedObjectContext

以上是关于将新对象插入 coreData的主要内容,如果未能解决你的问题,请参考以下文章

将新对象插入 coreData

将新对象插入特定数组索引

将新对象插入数据库时​​出现Swift dynamicCast错误

如何将新对象插入实体并设置该对象与另一个实体的现有对象的关系?

将新对象插入到 mongoose 中的子文档数组字段中

将新对象插入到 mongoose 中的子文档数组字段中