核心数据删除的项目即使在删除后仍然可见(直到应用重新启动)
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 后,部分标题仍然存在