如何在不重复的情况下插入与另一个相关的核心数据记录

时间:2011-05-04 07:29:13

标签: objective-c core-data one-to-many relationship duplication

我有两个核心数据实体ArticlesFavoriteArticlesFavorite有To-Many关系。首先,我成功插入了所有Articles个对象。

现在,我正在尝试在“收藏夹”实体中插入ArticleID,但我不能。记录插入时为空关系,或者在“文章”实体中插入新记录。

我认为我应首先在Articles实体中获取相关记录,然后使用它在Favorite中插入,但我不知道如何执行此操作。我目前的代码:

NSManagedObjectContext *context =[appDelegate managedObjectContext] ; 
favorite *Fav =[NSEntityDescription insertNewObjectForEntityForName:@"favorite" inManagedObjectContext:context];
Articles * Article = [NSEntityDescription insertNewObjectForEntityForName:@"Articles" inManagedObjectContext:context];

NSError *error;

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription 
                               entityForName:@"Articles" inManagedObjectContext:context];  
[fetchRequest setEntity:entity]; 
NSPredicate *secondpredicate = [NSPredicate predicateWithFormat:@"qid = %@",appDelegate.GlobalQID ];
NSPredicate *thirdpredicate = [NSPredicate predicateWithFormat:@"LangID=%@",appDelegate.LangID]; 
NSPredicate *comboPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects: secondpredicate,thirdpredicate, nil]]; 
[fetchRequest setPredicate:comboPredicate];
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
for (NSManagedObject *info in fetchedObjects) { 
        // ?????????????????????????

    }

}

任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:4)

首先,确保ArticleFavorite之间存在互惠关系,即双向关系。像这样:

Article{
  favorites<-->>Favorite.article
}

Favorite{
  article<<-->Article.favorites
}

在核心数据中定义互惠关系意味着从一侧设置关系会自动为另一侧设置关系。

因此,要为新创建的Favorite对象设置新的Article对象,您只需:

Favorite *fav =[NSEntityDescription insertNewObjectForEntityForName:@"favorite" inManagedObjectContext:context];
Articles *article = [NSEntityDescription insertNewObjectForEntityForName:@"Articles" inManagedObjectContext:context];
[article.addFavoriteObject:fav];
//... or if you don't use custom NSManagedObject subclasses
[[article mutableSetValueForKey:@"favorites"] addObject:fav];

如果Article对象或Favorite对象已存在,则首先获取对象,但设置关系的方式完全相同。

关键是确保您具有互惠关系,以便托管对象上下文知道在两个对象中设置关系。

答案 1 :(得分:0)

我通过创建新的Article对象来解决它:

Articles *NewObj = [fetchedObjects objectAtIndex:0];

并使用它来插入关系:

    [Fav setFavArticles:NewObj];
     [NewObj setArticlesFav:Fav];

非常感谢TechZen ..