CoreData,NSManagedObject如果不存在则获取或创建

时间:2011-02-23 16:42:58

标签: core-data

我正在尝试解析大量文本文件并将其内容组织为托管对象。文本文件中有很多重复项,因此“附带”任务之一就是摆脱它们。

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

有吗?

我还必须说我是核心数据的菜鸟。


如果您需要更多细节:

我正在尝试写一种字典。我有单词(Word {NSString * word,<< - >规则规则}),规则(规则{NSString名称,< - >> Word单词,<< - > PartOfSpeech partOfSpeech,< ;< - >结束结尾}),词性(PartOfSpeech {NSString name,<< - > Rule rule})(我希望符号是清楚的)。

两个单词相同,如果它们具有相同的单词属性,并且“链接”到相同的规则。如果它们具有相同的结尾和词性,则两个规则是相同的。

到目前为止,我编写了一个以NSPredicate,NSManagedObjectContext和NSEntityDescription作为输入的方法,首先查询数据存储区并在找到实体时返回实体,或者创建新实体,将其插入数据存储区并返回。但是,在这种情况下,我无法使用必要的数据(在该方法中)填充新实体,因此我必须传递带有属性名称及其值的NSDictionary并插入它们,或者通过引用返回一个标志是否是我创建了一个新对象或返回一个旧对象,以便我可以使用外部数据填充它。

但它看起来有点难看。我敢肯定必须有比这更优雅的东西,我找不到它。如果可以,请你帮助我。

2 个答案:

答案 0 :(得分:3)

你基本上在正确的道路上。核心数据是一个对象图。内置的动态不是很多。也没有“upsert”。就像你猜测的那样,你必须获取,如果它不存在,你插入一个。

答案 1 :(得分:1)

这是我刚开始用来处理fetch-or-create场景的内容。我正在使用顶级托管对象,该对象包含与从属对象的一些多对多关系。我有一个包含几个数据数组的类(这里没有显示)。该类负责保存和检索核心数据。创建类时,我执行fetch-or-create访问我的顶级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;

}

...