1

私が持っているのは、これらのプロパティを持つ「MyDocument」と呼ばれるコア データ エンティティです。

  • ファイル名
  • ファイル拡張子
  • ファイルURL

サーバーから一連のファイルをダウンロードし、それらをディスクの「キャッシュ」フォルダーに保存してから、各ドキュメントの 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 に参照を保持することにしました。

では、オブジェクトが削除される直前にジャンプして関連ファイルを削除し、実際のエンティティの削除を続行するカスタム アクセサーを作成するにはどうすればよいでしょうか。

前もって感謝します

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 に答える