Core data 核心数据存取器-删除前

Core data 核心数据存取器-删除前,core-data,ios5,Core Data,Ios5,我拥有的是一个名为“MyDocument”的核心数据实体,它具有以下属性 文件名 文件扩展名 文件URL 我从服务器下载了一堆文件,将它们保存在磁盘上的“Caches”文件夹中,然后在数据库中为每个文档插入行。这只会使管理应用程序中的文档更容易,而无需列出目录内容等 一切似乎都正常,除了删除实体时,我还想删除磁盘上的关联文件。我可以很容易地做这样的事情 for(MyDocument *myDocument in ParentEntity.mydocuments) { [[NSFil

我拥有的是一个名为“MyDocument”的核心数据实体,它具有以下属性

  • 文件名
  • 文件扩展名
  • 文件URL
我从服务器下载了一堆文件,将它们保存在磁盘上的“Caches”文件夹中,然后在数据库中为每个文档插入行。这只会使管理应用程序中的文档更容易,而无需列出目录内容等

一切似乎都正常,除了删除实体时,我还想删除磁盘上的关联文件。我可以很容易地做这样的事情

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才能预览该项目。如果我将文档保存在核心数据中,每次预览需要时,我都必须从存储的NSData将文件写入磁盘。这没有意义,所以我决定自己将它们存储在外部,并在DB中保留一个引用

所以,我如何编写一个自定义访问器,在对象即将被删除之前跳入并删除相关文件,然后继续删除实际实体


提前感谢

我认为最干净的方法是简单地将自定义方法添加到
NSManagedObject
子类中。下面我将其作为
NSManagedObjectContext
的一个类别,但您也可以将其作为
MyDocument
实例方法。通过这种方式,您可以显式删除实体和关联文档,同时仍然可以选择仅删除实体。另外,当您不再熟悉代码时,可以避免在将来意外删除内容;-)

或者作为
MyDocument
方法(不知道这种“自删除”是否有效):


NSManagedObject-PrepareOrderetion无疑是您需要在实体中实现的,以处理相关资源

在删除规则传播之前,核心数据为每个已删除的实体调用PrepareOrderElection,而该实体仍处于活动状态。这是实现任何比核心数据提供的非常基本的规则更复杂的东西的正确位置


它可以在不向NSManagedObjectContext添加内容的情况下工作,它可以与默认的NSManagedObjectContext-deleteObject一起工作,并且不会干扰NSEndomanager。当然,您必须为实体使用自定义类。

我可以覆盖deleteObject并删除其中的文件吗?
@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
-(void)deleteSelfAndAssociatedFiles {
   [[NSFileManager defaultManager] removeItemAtURL:
     [NSURL fileURLWithPath:self.fileURL] error:nil];
   [self.managedObjectContext deleteObject:self];
}