1

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

  • 文件名
  • 文件扩展名
  • 文件网址

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

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

for(MyDocument *myDocument in ParentEntity.mydocuments) 
{
    [[NSFileManager defaultManager] removeItemAtURL:[NSURL fileURLWithPath:myDocument.fileURL] error:nil];
    [context deleteObject:myDocument];
}

但是我正在尝试通过访问器完成此操作....以便我可以deleteObject:myDocument从任何地方调用 - 并确保相关文件也将被删除。

我知道我可以使用 Core Data 的 External File Storage 选项而不用担心这个,但我使用 QLPreviewController 来预览这些文档,并且 QLPreviewController 需要一个文件 URL 才能预览该项目。如果我将文档保存在 Core Data 中,每次 Preview 需要它时,我都必须将文件从存储的 NSData 写入磁盘。这没有任何意义,所以我决定自己将它们存储在外部并在数据库中保留参考。

那么,我将如何编写一个自定义访问器,该访问器将在对象即将被删除之前跳转并删除关联的文件,然后继续删除实际的实体..

提前致谢

4

2 回答 2

2

NSManagedObject -prepareForDeletion 肯定是您需要在实体中实现的,以处理相关资源。

Core Data 在删除规则传播之前为每个删除的实体调用 prepareForDeletion 。这是实现比 Core Data 提供的非常基本规则更复杂的任何东西的正确位置。

它可以在不向 NSManagedObjectContext 添加东西的情况下工作,它将与默认的 NSManagedObjectContext -deleteObject 一起工作,并且不会与 NSUndoManager 混淆。当然,您必须为您的实体使用自定义类。

于 2012-06-11T09:33:38.903 回答
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];
}
于 2012-06-08T06:46:38.877 回答