• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-13 01:09:22 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

使用 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)



Best Answer-推荐答案


我发现这个问题的最佳解决方案是将删除规则设置为 Nullify,并在我的 articleNSManagedObject 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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap