2012-01-03 22 views
3

私のデータベースには、写真、場所(撮影場所)、タグ(写真)の3つのエンティティがあります。コアデータ削除ルール

database

各写真は、それが撮影された場所に関係を持っています。 各場所には、一連の写真が撮影されています。

各写真にはタグのセットがあり、各タグには一連の写真があります。これは多対多の関係です。単一の写真に複数のタグを含めることができ、タグを複数の写真に関連付けることができるからです。

今、私はこの動作のルールを削除する権利を把握することはできません。

  • 私が直接、写真だけエンティティを削除したいです。
  • 関連する場所に他の写真が撮影されている場合は、削除しないでください。写真がその場所の最後の写真の場合は削除する必要があります。
  • 関連タグは他の写真にも表示されますが、他の写真が関連付けられていない限り削除しないでください。
  • さらに、タグエンティティには、関連付けられた写真の数を記録する属性があります(新しい写真を追加するときにこの属性を更新し、写真のprepareForDeletionでも属性を更新します)。

ご提案がありますか?

答えて

1

そうで、マーカスに感謝し、私はNullifyにすべて削除ルールを設定して、その後、私は写真のprepareForDeletionでこのコードを書いた:

- (void)prepareForDeletion 
{  
    //tag check: if this photo was the last associated with that tag, deletion !! 
    for (Tag *tag in self.tags) { 
     if ([tag.taggedPhotos count] == 1) { 
      [self.managedObjectContext deleteObject:tag]; 
     } else { 
      tag.photoCount = [NSNumber numberWithInt:[tag.photoCount intValue]-1]; 
     } 
    } 

    //place check: if this photo was the last associated with that place, deletion !! 
    if ([self.whereTaken.photos count] == 1) { 
     [self.managedObjectContext deleteObject:self.whereTaken]; 
    } 
} 

i「は以来、私は、numberOfPhotosTagged属性を削除していませんそれを使ってタグをソートします。

2

最初にタグは、写真の数を記録するために別の属性を必要とすべきではありません。その数の関係を照会することができます。

第2に、Photoエンティティに-prepareForDeletionを設定して、それがタグを参照する唯一の写真であるかどうかを確認し、それが真であれば削除します。

同様に、写真を削除すると、-prepareForDeletionにその場所にある写真の数を確認し、同じロジックを呼び出すことができます。

モデル自体では、削除ルールを無効にするように設定します。

+0

私は、これは、ソートディスクリプタだった...(最初の最も使用される)タグをソートするために、「numberOfPhotosTagged」属性を使用: [NSSortDescriptor sortDescriptorWithKey:「numberOfPhotosTagged」昇順@:NO] – Ciampo

+0

ああ、あなたは 'タグを使用することができるはずです代わりにソート記述子として.count'を使用し、値を同期させておく必要はありません。テストされていないので、保証はありませんが*動作するはずです。 –

+0

タグをソートしているので、 'NSSortDescriptor sortDescriptorWithKey:@ taggedPhotos。@ count "昇順:NO"を使用しましたが、プログラムはこのエラーを終了します:' KeypathはKVC集約を含んでいます。 @ count ' – Ciampo

関連する問題