2012-03-15 8 views
0

コアデータにNoteObjectsを保存します。通常、NoteObjectは、NSString *mainTextおよびNSMutableArray *arrayOfTagsNSStringsの配列)を有する。コアデータを使用したいのですが、配列はコアデータを扱うのは難しい問題です。通常、NoteObjectは配列内に50個以上のタグを持ちません。それで私はどのようにこれをモデル化すべきですか?Core Dataエンティティをモデル化する方法は?

  1. 配列
  2. は、私が読んだ対多の関係を、使用する格納するtransformableプロパティを使用してそれを行うには、より「合法的な」方法です:私は2つのオプションがあります。

どちらを使用する必要がありますか?私は単純な構造と多対多の関係をどのように実装しますか?私はその概念の周りに私の指を包むように見えることはできません。

+0

CoreDataが正しいアプローチですか?データが十分に小さい場合はNSCodingを見ましたか?大規模なデータセットを持っている場合は@Eugeneの回答に従ってください:) – deanWombourne

答えて

4

多対多の関係を使用します。フェッチ要求の間、それはより簡単で簡単です。以下のスクリーンショットを参照してください。右側のRelationship managerに注意を払い、NoteToObjectから "To-Many Relationship"をタグに設定します。 Playerエンティティを無視します。

ああ、 "削除ルール"に注意してください。特定のNoteObjectに関連付けられているすべてのタグを削除することができます。その場合は、カスケードに設定します。

NoteObjectエンティティenter image description here

タグエンティティenter image description here

--edit:

あなたが最初にあなたのNoteObjectを取得する必要がある複数のタグを追加するには - 私はあなたのIDパラメータのいくつかの並べ替えがあるだろうと仮定NoteObjectを区別するために使用します。 CoreDataは自動的にタグの追加/削除メソッドを生成します。次のようなコードを使用する必要があります。

- (void)addTags:(NSArray *)tags toNoteObjectWithID:(NSString *)noteID { 
    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"NoteObject"]; 
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"noteID == %@", noteID]; 
    [fetchRequest setPredicate:pred]; 
    NoteObject *noteObject = [[[self managedObjectContext] executeFetchRequest:fetchRequest error:nil] lastObject]; 

    for (NSString *tag in tags) { 
    Tag *t = [NSEntityDescription insertNewObjectForEntityForName:@"Tag" 
              inManagedObjectContext:[self managedObjectContext]]; 
    t.body = tag; 
    t.noteObject = noteObject; 
    [noteObject addTagsObject:t]; 
    } 
    [self saveContext]; 
} 
+0

これで、ノートオブジェクトに複数のタグを追加するにはどうすればよいですか? – Snowman

+0

@mohabitarは答えを – Eugene

+0

修正しました。ありがとう、ありがとう。また、タグエンティティ用のクラスファイルを生成する必要がありますか? – Snowman

1

変換可能なプロパティを使用できますが、トランスを書き込む必要があります。

toManyリレーションシップを使用する場合、おそらく1つの属性、つまり文字列値と単一のリレーションシップのみを持つタグのエンティティを追加作成する必要があります。少し推測すると、タグが持つことができる値の有限集合があると思います。タグXを持つすべてのノートがいつでも必要になるかもしれません。そして、Xの文字列値を含むエンティティをフェッチしてから、関係にXを持つオブジェクトのNSArrayを取得します(あなたが何を呼び出したとしても)。

1

iOS 5より前ではサポートされていなかったため、配列はCore Dataで扱いにくかったため、並べ替え可能な属性(作成日など)を含める必要がありました。 iOS 5が必要ない場合は、ordered relationshipsを使用できます。結果はNSOrderedSetに返されます。NSOrderedSetは配列とよく似ていて(配列に変換できる)または、問題を再考する - メモやユーザーにとって重要なメモのタグの順序は?タグをアルファベット順に表示しても大丈夫でしょうか?そうであれば、より良い - 単純な古い(順序付けられていない)対多関係を使用してください。

関連する問題