核心数据删除的项目即使在删除后仍然可见(直到应用重新启动)

Posted

技术标签:

【中文标题】核心数据删除的项目即使在删除后仍然可见(直到应用重新启动)【英文标题】:Core data deleted items are visible even after delete (till app relaunches) 【发布时间】:2013-12-15 08:02:48 【问题描述】:

我在两个表之间有一个多对多的关系,比如表 A 和 B。

为了业务逻辑,我将此属性与“无操作”一起作为删除规则。

第 1 步:现在我正在删除表 A 项目。

第2步:删除表A项目后,我想删除表B中与表A中任何项目都没有连接的项目。

所以第 2 步的删除代码 sn-p 有点像这样:

for (TableBItem* item in fetchedObjects) 
    if ([[item.tableAproperty allObjects] count] == 0) 
        [context deleteObject:item];
    
 
 //save context
 [context save:&error]

之后,当我获取 tableB 对象时,它甚至会显示我试图删除的那些项目。

如果我终止应用程序并再次启动,则获取项目将按预期工作。

知道这里可能出了什么问题。提前致谢。

【问题讨论】:

你的上下文架构是什么?保存成功了吗? 我使用的是普通的 NSManagedObjectContext,是的,保存成功,没有错误。 【参考方案1】:

实现此目的的一种行之有效的方法是覆盖 TableBItem 的托管对象子类中的 remove object Xcode-generated setter 方法(顺便说一句,这是一个可怕的名字 - 另外,tableAProperty 具有误导性,因为它是一种关系而不是一种关系属性)。

-(void)removeTableAPropertyObject:(TableAItem *)value 
     [super removeTableAPropertyObject:value];
     if (!self.tableAProperty.count) 
        [self.managedObjectContext deleteObject:self];
     

【讨论】:

善意回答,无评论的否决票。非常感谢你。我经常使用这种模式,没有错误。 同意@Mundi。此外,不加评论的投票也无济于事。【参考方案2】:

想到的一件事是将删除规则设置为“nullfiy”。这样,删除实体 A 将使 B 与 A 的关系无效。因此,在删除所有 A 后,没有 B 将链接到 A。 我真的无法解释重新启动后的差异,我猜是一些陈旧或缓存/故障影响。

【讨论】:

nullify 属性的问题是 B 链接到多个 A 项目,删除 A 中的任何项目将使 B 的项目无效,这是我不想要的。只有当 B 项没有与任何 A 链接时,我才想删除它。 啊,我明白了。根据性能,最简单的方法是实现 prepareFoDeletionMethod。在这种方法中,检查关系的另一端,看看youbare /是最后一个关系,然后也删除is。这只会在不太严重或不太频繁的情况下运作良好。请参阅 NSManagedObject 上的 dics:讨论 您可以实现此方法以在删除对象之前执行所需的任何操作,例如在关系被拆除之前的自定义传播,或使用键值观察重新配置对象。

以上是关于核心数据删除的项目即使在删除后仍然可见(直到应用重新启动)的主要内容,如果未能解决你的问题,请参考以下文章

即使在删除部分数据并重新加载 UICollectionView 后,部分标题仍然存在

从应用程序中删除了核心位置,但仍被要求提供用户位置

我从项目中删除了一些核心数据生成文件,但 Xcode 仍然尝试编译它们

删除后尝试保存时核心数据崩溃

黑客入侵 Wordpress 网站后删除缓存

删除核心数据对象并保存在后台线程中