質問

複数のエンティティを含むデータモデルがあり、それぞれが画像データを保存するいくつかの異なる属性を持っています。これらはすべて小さな画像になり、外部ファイルとしてではなく、永続ストアに保存する必要があります。

バイナリまたは変換可能な属性に画像データを保存することはできますが、ユーザーがこれらの属性の2つ以上に同一の画像を指定する可能性が高いため、一意の画像のコピーを1つ保存するのではなく、画像データの複製。

" ImageBlob"の作成に混乱しています。画像データを保存し、これを行うために関係を使用するエンティティですが、私はコアデータの初心者であり、これが正しい方法であるかどうかはすぐにはわかりません。特に、次の状況にどのように対処しますか?

  • 複数のエンティティのすべての画像属性で同じ「画像データストア」を使用したい各画像blobの1つのインスタンスのみが保存されるようにします
  • データストア内の画像を使用しているオブジェクトが存在しない場合、削除されることを確認する必要があります

これを処理する最良の方法は何ですか?

役に立ちましたか?

解決

最初の質問は、2つのオブジェクトが同じ画像を使用していることをどのように特定する予定ですか?画像に保存してクエリできるプロパティがあり、設定している画像が既に存在するかどうかを判断できますか?そして、それは計算上どれくらい高価ですか?時間がかかる場合、ストレージの最適化とパフォーマンスへの影響が生じる可能性があります。

ただし、これを効率的に行う方法がある場合は、 ImageBlob エンティティを作成して、説明したことを実行できます。 ImageBlob sを使用するエンティティには、 ImageBlob との imageBlob または imageBlobs の関係が必要です。 ImageBlob は、たとえば users などの名前と逆の関係を持つ必要があります。

コードで、 ImageBlob を再利用する場合、次のように簡単です:

NSManagedObject *blob = // get the image blob
NSManagedObject *user = // get the user
[user setValue:blob forKey:@"imageBlob"]; // do this if it uses a single image
[[user mutableSetValueForKey:@"imageBlobs"] addObject:blob]; // do this if it uses multiple images

もう1つ考慮すべきことは、不要になったBLOBをどう処理するかです。おそらく、使用されていない画像をドロップしたいでしょう。これを行うには、 NSManagedObjectContextObjectsDidChangeNotification 通知のために、アプリケーションデリゲートまたは NSPersistentDocument サブクラス(アプリがドキュメントベースかどうかによって異なります)にサインアップします。管理対象オブジェクトのコンテキストが変更されるたびに、次のように不要な画像を削除できます。

- (void)managedObjectContextObjectsDidSave:(NSNotification *)notification {
    NSManagedObjectContext *managedObjectContext = [notification object];

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    [fetchRequest setEntity:[NSEntity entityWithName:@"ImageBlob" inManagedObjectContext:managedObjectContext]];
    [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"users.@count == 0"];
    NSArray *unusedBlobs = [managedObjectContext executeFetchRequest:fetchRequest error:nil]; // Don't be stupid like me; catch and handle the error
    [fetchRequest release];

    for (NSManagedObject *blob in unusedBlobs) {
        [managedObjectContext deleteObject:blob];
    }
}

他のヒント

md5という一意のプロパティを Image エンティティに追加して、同じ画像を一度だけ保存するようにします。

Core Dataに関しては、次のように動作する可能性があります。 次に、抽象的な親エンティティ( Parent )を作成します。 image という名前の Parent から Image への関係を追加し、「カスケード」を設定します。 Parent を削除すると、 Image も削除されます。 Image から parent と呼ばれる parent などの関係を追加し、" Nullify"を設定します。 Image を削除すると、 Parent の画像が nil に設定されるように、削除メソッドを設定します。次に、他のエンティティを追加し、その親を Parent に設定します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top