2012-06-08 104 views
1

我有什么是核心数据实体,称为 “myDocument中”,它具有以下属性核心数据存取器 - 前删除

  • 文件名
  • fileExtension
  • fileURL

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

一切看起来不错,除了当我删除实体时,我也想删除磁盘上的关联文件。我可以很容易地做这样的事情

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中保留参考。

所以,我怎么会写一个自定义的访问,将在之前的对象是即将被删除,并删除相关的文件,然后用删除的实际实体进行跳跃..

在此先感谢

回答

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]; 
} 
+0

我可以覆盖deleteObject并删除那里的文件吗? –

2

NSManagedObject -prepareForDeletion肯定是你需要在你的实体来实现,照顾什么的相关资源。

核心数据调用prepareForDeletion为每个删除的实体,同时仍然活着,以及在删除规则传播之前。这是实施比核心数据提供的基本规则更复杂的任何事情的正确地点。

它没有添加东西到NSManagedObjectContext,它将与默认的NSManagedObjectContext -deleteObject一起工作,它不会混淆NSUndoManager。当然,你必须为你的实体使用自定义类。

+0

这个任何代码示例?如果你有一个会很棒 –