使用 Core Data,我希望建立一个具有以下一对多关系的标记系统:
article.tags <<------->> tag.articles
在这种情况下,article
可以有多个 tags
,而这些相同的 tags
可以分配给多个 article
。每当编辑 article
的标签时,我都会删除与 article
关联的所有以前的 tags
并重新添加那些仍然相关的标签,例如所以:
// 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!");
}
}
为了完整起见,这里有一个示例输出(显示了创建两个 articles
和两个共享 tags
:食物和快餐)。删除一篇 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)
我发现这个问题的最佳解决方案是将删除规则设置为 Nullify,并在我的 article
的 NSManagedObject
prepareForDeletion
方法:
- (void)prepareForDeletion
{
[super prepareForDeletion];
for (Tag *tag in self.tags)
{
if(tag.events.count == 1)
{
[self.managedObjectContext deleteObject:tag];
}
}
}
关于iphone - 处理对多关系中 Core Data 对象的删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14944991/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |