2012-06-08 65 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

這個任何代碼示例?如果你有一個會很棒 –