2012-06-08 3 views
1

Что у меня есть это ядро ​​Data Entity под названием "MyDocument", обладающий этими свойствамиОсновные данные Accessor - Перед Удалить

  • имя_файла
  • FileExtension
  • fileURL

загрузить кучу файлов с сервера, сохраните их на диске в папке «Кэш», а затем вставьте строки в БД для каждого документа. Это просто упрощает управление документами в приложении без указания содержимого каталога и т. Д.

Все кажется ОК, за исключением того, что когда я удаляю Entity, я также хочу удалить связанный файл на диске. Я мог бы легко сделать что-то вроде этого

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, мне придется записывать файл на диск из сохраненного NSData каждый раз, когда его нужно. Это не имело смысла, поэтому я решил хранить их снаружи самостоятельно и хранить ссылку в БД.

Итак, как бы я написать собственный аксессор, что бы прыгать в непосредственно перед объектом собирается быть удалены, и удалить соответствующий файл, а затем продолжить с удалением фактической Entity ..

Заранее спасибо

ответ

1

Я думаю, что самый чистый способ - просто добавить пользовательский метод к вашему подклассу NSManagedObject. Ниже я сделал эту категорию NSManagedObjectContext, но вы также можете сделать это как метод экземпляра MyDocument. Таким образом, вы можете явно удалить Entity и связанный с ним документ, сохраняя возможность просто удалить объект. Кроме того, вы избегаете случайного удаления в будущем, когда вы больше не знакомы с вашим кодом ;-).

@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 для каждого удаленного объекта, все еще живого и хорошо, и до распространения правил удаления. Это подходящее место для реализации чего-либо более сложного, чем те самые основные правила, которые предоставляет Core Data.

Он работает без добавления материала в NSManagedObjectContext, он будет работать со стандартным NSManagedObjectContext -deleteObject, и он не будет работать с NSUndoManager. Конечно, вы должны использовать пользовательские классы для своих объектов.

+0

любой пример кода для этого? было бы здорово, если бы у вас был один. –

Смежные вопросы