删除Core Data对象时如何处理外部数据的清理

Bre*_*ent 6 iphone core-data ios

我对Core Data相当新,遇到了其他人必须遇到的问题.

我的数据模型包括图像,我将数据保存在数据库外部,只需将路径/ URL存储到图像中.(根据Apple的核心数据演示之一推荐)

删除我的图像对象时,我可以手动遍历关系并删除图像文件,但我想知道是否有更优雅的方法来执行此操作.

理想的解决方案将以某种方式与图像对象绑定,并与Core Data undo/redo一起使用.

rge*_*rge 13

在"图像"实体类中,实现willSave.[self isDeleted]如果是,请检查并删除文件.这推迟了文件的实际删除,直到保存了商店,这为您提供了一些撤销功能.设置适当的级联规则,以便在所有者离开时删除图像实体,然后就可以了.

[eta:Phil Calvin在下面的评论是对的 - didSave如果你使用多种情境,那可能是一个更好的地方.]

[ETA.很久以后:] MartinW提出了一个很好的观点 - 如果对象从未被保存过,将会保存/保存不会被调用.删除未保存的对象只是从上下文中取消它并将其抛弃,没有特殊的生命周期事件.只是为了使事情更复杂,你可以"撤消"和"重做"一个删除,包括(我认为)这种.

想到的一些方法:

这可能是覆盖的情况prepareForDeletion:,加上awakeFromSnapshotEvents:捕获不删除和重新删除.要支持撤消/重做,您不需要在现场删除该文件,而是使用某种"要删除"的注册表(例如,在发布保存通知时清理一组共享的可变文件名).那么/ didSave是不合适的.

或者,如果你可以使用BLOB字段而不是文件,你可以检查二进制属性上的"允许外部存储"框,将jpeg数据放在那里,并获得文件存储的一些(不是全部)优点(大多数)头痛.数据库中将保留少量二进制文件; 任何大于私有阈值的内容都将被分流到一个单独的隐藏核心数据管理文件中.但是,当对象发生错误时,核心数据仍然需要将整个内容加载到NSData中.我将这种方法用于"用户头像"型小图像.

最后,如果images目录中没有其他内容,您可以注册didSave通知并在任何保存后手动清理.对所有Image.filename属性运行获取请求,将其与相关图像目录列表进行比较,并根据需要进行删除.我在开发过程中使用这种方法作为我的"大棒",以确保其他一切都在做它应该做的事情.

[让我知道这些方法的成功与艰辛,我会及时更新.]

  • 删除`willSave`中的图像可能会导致您删除仍在持久存储中引用的图像.你可能想避免这种情况.详情请见我的回答. (3认同)