核心数据:使用To many关系插入和删除

时间:2014-02-12 15:27:02

标签: ios objective-c core-data

我正在制作一个包含核心数据的简单日记应用。

主模型(Journal)将包含标题和正文。 每个条目可以有一个或多个标签。

要插入新的(期刊),我只需这样做:

Journal *newJournal  [NSEntityDescription insertNewObjectForEntityForName:@"Journal"
                                             inManagedObjectContext:context];
//Save 

问题1:在条目中添加标签的正确方法是什么?

我可以这样做:

Tag *tag1 = [NSEntityDescription insertNewObjectForEntityForName:@"Tag"
                                             inManagedObjectContext:context];
Tag *tag2 = [NSEntityDescription insertNewObjectForEntityForName:@"Tag"
                                             inManagedObjectContext:context];
newJournalEntry.tags = [[NSOrderedSet alloc] initWithObjects:tag1,tag2,nil];
// Save card... 

...但这将为每个条目创建新标签。我只需要核心数据模型中每个标记的唯一实例。

问题2:如何按标签查询日记帐分录,例如“获取具有 fun 标记的所有日记帐分录”

我还需要获取所有创建的标签并显示它们,例如:“你有3个标签:有趣,运动,度假”

enter image description here

2 个答案:

答案 0 :(得分:1)

回答1:您需要在标记和journalEntry之间将模型更改为多对多,然后您需要查询模型以查看标记是否已存在。如果他们这样做,那么您只需将它们链接到您的输入实体。

示例(在伪代码中):

NSOrderedSet tags = nil;
//Create and fetch for the tags you are looking for. Then:

 if([[FetchedResultController fetchedObjects] count] > 0) {

     tags = [[NSOrderedSet alloc] initWithArray:[FetchedResultController fetchedObjects]];

 } else {
   //The code you actually have (almost)
   Tag *tag1 = [NSEntityDescription insertNewObjectForEntityForName:@"Tag"
                                         inManagedObjectContext:context];
   Tag *tag2 = [NSEntityDescription insertNewObjectForEntityForName:@"Tag"
                                         inManagedObjectContext:context];
   tags = [[NSOrderedSet alloc] initWithObjects:tag1,tag2,nil];
 }

 //Then just set your tags
 newJournalEntry.tags = tags;

答案2:一旦你实现了答案1,那么你找到那些标签,然后只使用与journalEntry的关系(例如:tags.journal),这应该是一个NSSet。

再次伪代码:

for(Tag *tag in [FetchResultController fetchedObjects]) {

       //Get the Journal Entries using:  "tag.journal" 
      NSSet *journalEntriesWithTagRequested = tag.journal;

      // Do what you must with journalEntriesWithTagRequested . . .

   }

答案 1 :(得分:1)

首先,您需要在Journal和Tag模型之间建立多对多关系,否则您将无法为多个日记条目分配相同的标记

enter image description here

答案1:在将任何代码分配到日记帐分录之前,从商店中获取现有代码:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Tag"];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"name IN %@", @[@"tag1", @"tag2"]];
NSArray *tags = [moc executeFetchRequest:fetchRequest error:&error];

然后,您应该仅为缺少的标记创建带有-insertNewObjectForEntityName的标记。

回答2:

NSError *error;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Journal"];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"tags CONTAINS[cd] %@", @"fun"];
NSArray *journalEntries = [moc executeFetchRequest:fetchRequest error:&error];

您可以在Predicates Programming Guide

中详细了解谓词