Core data CoreData,NSManagedObject获取或创建(如果不存在)

Core data CoreData,NSManagedObject获取或创建(如果不存在),core-data,Core Data,我试图解析大量文本文件,并将其内容组织为托管对象。文本文件中有很多重复项,因此“辅助”任务之一就是清除它们 在这方面,我试图做的是检查具有给定内容的实体是否存在,如果不存在,则创建一个实体。但是,我有不同的实体,具有不同的属性和关系。我想要的是一种函数,它可以将多个属性作为输入,并返回一个新的NSManagedObject实例,我不必担心它是否插入到数据存储中或从中获取 有吗 我还必须说,我是核心数据的noob 如果需要,请提供更多详细信息: 我想写一本字典。我有words(Word{NSSt

我试图解析大量文本文件,并将其内容组织为托管对象。文本文件中有很多重复项,因此“辅助”任务之一就是清除它们

在这方面,我试图做的是检查具有给定内容的实体是否存在,如果不存在,则创建一个实体。但是,我有不同的实体,具有不同的属性和关系。我想要的是一种函数,它可以将多个属性作为输入,并返回一个新的NSManagedObject实例,我不必担心它是否插入到数据存储中或从中获取

有吗

我还必须说,我是核心数据的noob


如果需要,请提供更多详细信息:


我想写一本字典。我有words(Word{NSString*Word,Word-Word,你的路径基本正确。核心数据是一个对象图。没有太多的动态内置。也没有“upsert”。正如您所猜测的,您必须获取,如果它不存在,则插入一个。

以下是我刚刚开始用于处理获取或创建场景的内容。我使用的是顶级托管对象,其中包含与从属对象的几对多关系。我有一个类,其中包含一些数据数组(此处未显示)。该类负责保存和检索核心数据。创建该类时,我执行获取或创建以访问顶级NSManagedObject

@implementation MyDataManagerClass

...

@synthesize MyRootDataMO;

- (MyDataManagerClass *) init {

    // Init managed object

   NSManagedObjectContext *managedObjectContext = [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];

   // Fetch or Create root user data managed object

   NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"MyRootDataMO" inManagedObjectContext:managedObjectContext];
   NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];

   [request setEntity:entityDescription];

   NSError *error = nil;
   NSArray *result = [managedObjectContext executeFetchRequest:request error:&error];

   if (result == nil) {
       NSLog(@"fetch result = nil");
        // Handle the error here
   } else {
       if([result count] > 0) {
           NSLog(@"fetch saved MO");
           MyRootDataMO = (MyRootDataMO *)[result objectAtIndex:0];
       } else {
           NSLog(@"create new MO");
           MyRootDataMO = (MyRootDataMO *)[NSEntityDescription insertNewObjectForEntityForName:@"MyRootDataMO" inManagedObjectContext:managedObjectContext];
       }

   }

   return self;

}

...

这对小数据集非常有效,但在扩展到更大的数据集(例如字典或同义词)时效率非常低。这是6年前的代码。我不记得它是用来做什么的,但它只在init中执行(注意它返回的自我,而不是任何获取的结果)从表面上看,这个类会被调用很少次,可能在应用程序启动时只有一次,以单例初始值设定项的形式调用,并且只用于让自己访问托管对象树的单个入口点。然后,该类可以被扩展以创建核心数据的外观。公平地说,这是一个老问题的老答案&更像是一个技术演示,而不是pro导入代码。OP询问的是大规模数据设计模式,此解决方案不适用于这些模式。这并不是说它完全错误,只是它不适用于大型数据集。我自己也在小型数据集上使用过此技术,用于大型数据集(例如10000条记录)在插入/更新之前,我使用一组获取的实体数据来确定成员身份。