菜鸟教程小白 发表于 2022-12-13 01:09:22

iphone - 处理对多关系中 Core Data 对象的删除


                                            <p><p>使用 Core Data,我希望建立一个具有以下一对多关系的标记系统:</p>

<pre><code>article.tags &lt;&lt;-------&gt;&gt; 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 &amp;&amp; &gt; 0)
    {
      NSLog(@&#34;Found %d tags&#34;, );
      for(Tag *tag in objects)
      {
            NSLog(@&#34;\t%@ (%d events)&#34;, tag.name, tag.articles.count);
      }
    }
    else
    {
      NSLog(@&#34;No tags found!&#34;);
    }
}
</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]
查看完整版本: iphone - 处理对多关系中 Core Data 对象的删除