iphone - 处理对多关系中 Core Data 对象的删除
<p><p>使用 Core Data,我希望建立一个具有以下一对多关系的标记系统:</p>
<pre><code>article.tags <<------->> tag.articles
</code></pre>
<p>在这种情况下,<code>article</code> 可以有多个 <code>tags</code>,而这些相同的 <code>tags</code> 可以分配给多个 <code>article</code>。每当编辑 <code>article</code> 的标签时,我都会删除与 <code>article</code> 关联的所有以前的 <code>tags</code> 并重新添加那些仍然相关的标签,例如所以:</p>
<pre><code>// Remove any existing tags from this article
if(article.tags.count)
{
NSSet *existingEventTags = ;
for (NSManagedObject *tag in existingEventTags)
{
[ removeObject:tag];
;
}
}
// Now re-assign any applicable tags to this article
for(NSString *tag in tags)
{
Tag *existingTag = ;
if(existingTag)
{
;
}
else
{
NSEntityDescription *entityDescription = ;
Tag *newTag = (Tag *)[ initWithEntity:entityDescription insertIntoManagedObjectContext:moc];
newTag.name = tag;
;
}
}
</code></pre>
<p>我的问题是如何最好地处理与这两个关系相关的删除规则。本质上,我正在寻找的行为是,当我从 <code>article</code> 中删除 <code>tag</code> 时,我只想在没有其他 <code>articles</code> 的情况下完全删除它> 已被标记。</p>
<p>为了实现这一点,我将我的 <code>tag.articles</code> 关系设置为 Nullify,并将我的 <code>articles.tags</code> 关系设置为 Cascade。但是,当删除一篇文章时,与它相关的任何标签(无论它们是否与其他文章相关联)都会被删除。为了测试这一点,我编写了一个简单的调试函数,我将在下面包含它:</p>
<pre><code>- (void)debugTags
{
NSFetchRequest *request = [ init];
NSEntityDescription *entity = ;
;
// Execute the fetch.
NSError *error = nil;
NSArray *objects = ;
if (objects != nil && > 0)
{
NSLog(@"Found %d tags", );
for(Tag *tag in objects)
{
NSLog(@"\t%@ (%d events)", tag.name, tag.articles.count);
}
}
else
{
NSLog(@"No tags found!");
}
}
</code></pre>
<p>为了完整起见,这里有一个示例输出(显示了创建两个 <code>articles</code> 和两个共享 <code>tags</code>:食物和快餐)。删除一篇 <code>article</code> 后,我希望在商店中仍能找到食物和快餐,但关系计数为 1。</p>
<pre><code>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)
</code></pre></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>我发现这个问题的最佳解决方案是将删除规则设置为 Nullify,并在我的 <code>article</code> 的 <code>NSManagedObject</code> <code>prepareForDeletion</code> 方法:</p>
<pre><code>- (void)prepareForDeletion
{
;
for (Tag *tag in self.tags)
{
if(tag.events.count == 1)
{
;
}
}
}
</code></pre></p>
<p style="font-size: 20px;">关于iphone - 处理对多关系中 Core Data 对象的删除,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/14944991/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/14944991/
</a>
</p>
页:
[1]