核心数据访问器 - 删除前

时间:2012-06-08 06:19:32

标签: core-data ios5

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

  • 文件名
  • fileExtension
  • fileURL

我从服务器下载了一堆文件,将它们保存在“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中保留一个引用。

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

提前致谢

2 个答案:

答案 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];
}