使用核心数据,我期待下建立有以下一对多关系的标签系统:处理核心数据的缺失对象的一对多关系
article.tags <<------->> tag.articles
在这种情况下的article
可以有无数tags
,并且那些相同的tags
可以被分配给多个articles
。每当article
的标签编辑,我删除与相关联的所有以前tags
的article
并重新添加那些仍然具有现实意义,就像这样:
// Remove any existing tags from this article
if(article.tags.count)
{
NSSet *existingEventTags = [article.tags copy];
for (NSManagedObject *tag in existingEventTags)
{
[[article mutableSetValueForKey:@"tags"] removeObject:tag];
[moc deleteObject:tag];
}
}
// Now re-assign any applicable tags to this article
for(NSString *tag in tags)
{
Tag *existingTag = [self existingTagWithString:tag];
if(existingTag)
{
[article addTagsObject:existingTag];
}
else
{
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Tag" inManagedObjectContext:moc];
Tag *newTag = (Tag *)[[NSManagedObject alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:moc];
newTag.name = tag;
[article addTagsObject:newTag];
}
}
我的问题是如何最好地处理与相关删除规则这两个关系。基本上,我要找的行为是当我从article
中删除tag
时,我只想完全删除它,如果没有其他articles
已被标记。
要完成此操作,我已将我的tag.articles
关系设置为Nullify,并将我的articles.tags
关系设置为Cascade。但是,删除文章时,与其关联的任何标签(无论它们是否与其他文章关联)都将被删除。为了测试这个我写了一个简单的调试功能,我将在下面包括:
- (void)debugTags
{
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Tag" inManagedObjectContext:moc];
[request setEntity:entity];
// Execute the fetch.
NSError *error = nil;
NSArray *objects = [moc executeFetchRequest:request error:&error];
if (objects != nil && [objects count] > 0)
{
NSLog(@"Found %d tags", [objects count]);
for(Tag *tag in objects)
{
NSLog(@"\t%@ (%d events)", tag.name, tag.articles.count);
}
}
else
{
NSLog(@"No tags found!");
}
}
为了完整起见,这里是一个示例输出(显示了两个共享tags
两个articles
创建:食品和快餐)。下面的一个article
删除,我希望仍然寻找食物和快餐店里,但与1
Before deletion
---------------
Found 4 tags
breakfast (1 events)
food (2 events)
fastfood (2 events)
lunch (1 events)
After deletion
--------------
Found 1 tags
lunch (1 events)
这对我来说很好。这些规则是正确的。你做过任何测试,看看它是否有效? – 2013-02-18 22:16:05