我所拥有的是名为“MyDocument”的核心数据实体,它具有这些属性
我从服务器下载了一堆文件,将它们保存在“Caches”文件夹中的磁盘上,然后在DB中为每个文档插入行。这样可以更轻松地管理应用程序中的文档,而无需列出目录内容等...
一切似乎都没问题,除了当我删除实体时,我还想删除磁盘上的相关文件。我可以很容易地做这样的事情
for(MyDocument *myDocument in ParentEntity.mydocuments)
{
[[NSFileManager defaultManager] removeItemAtURL:[NSURL fileURLWithPath:myDocument.fileURL] error:nil];
[context deleteObject:myDocument];
}
但是我试图通过访问器来完成这个....所以我可以从任何地方调用 - deleteObject:myDocument
并确保相关文件也会被删除。
我知道我可以使用Core Data的外部文件存储选项而不用担心这一点,但我使用QLPreviewController来预览这些文档,而QLPreviewController需要一个文件URL才能预览该项目。如果我将文档保存在Core Data中,每次Preview需要时,我都必须从存储的NSData将文件写入磁盘。它没有意义,所以我决定自己将它们存储在外部,并在DB中保留一个引用。
那么,我将如何编写一个自定义访问器,它将在对象即将被删除之前跳转并删除相关文件,然后继续删除实际实体..
提前致谢
答案 0 :(得分:2)
NSManagedObject -prepareForDeletion肯定是您需要在实体中实现的,以处理相关资源。
核心数据为每个已删除的实体调用prepareForDeletion,同时仍然处于活动状态且在删除规则传播之前。这是实现比Core Data提供的基本规则更复杂的任何事情的正确场所。
它可以在不向NSManagedObjectContext添加内容的情况下工作,它可以使用默认的NSManagedObjectContext -deleteObject,并且不会弄乱NSUndoManager。当然,您必须为您的实体使用自定义类。
答案 1 :(得分:1)
我认为最简单的方法是简单地向您的NSManagedObject
子类添加自定义方法。下面我将其设为NSManagedObjectContext
类别,但您也可以将其作为MyDocument
实例方法。通过这种方式,您可以显式删除实体和关联文档,同时仍然可以选择删除实体。此外,当您不再熟悉代码时,您将避免在将来意外删除内容;-)。
@interface NSManagedObjectContext (customDelete)
-(void)deleteMyDocumentObjectAndAssociatedFiles:(MyDocument *)object;
@end
@implementation NSManagedObjectContext (customDelete)
-(void)deleteMyDocumentObjectAndAssociatedFiles:(MyDocument *)object {
[[NSFileManager defaultManager] removeItemAtURL:
[NSURL fileURLWithPath:object.fileURL] error:nil];
[self deleteObject:object];
}
@end
或者MyDocument
方法(不知道这个“自我删除”是否有效):
-(void)deleteSelfAndAssociatedFiles {
[[NSFileManager defaultManager] removeItemAtURL:
[NSURL fileURLWithPath:self.fileURL] error:nil];
[self.managedObjectContext deleteObject:self];
}