如何建模我的核心数据实体?

时间:2012-03-15 18:34:51

标签: iphone objective-c core-data

我想将NoteObjects存储在Core Data中。通常情况下,NoteObject有一个NSString *mainText和一个NSMutableArray *arrayOfTags(一个NSStrings数组)。我现在想要使用核心数据,但数组是核心数据的棘手问题。通常,NoteObject在其数组中不会有超过50个标记。那么我应该如何建模呢?我有两个选择:

  1. 使用transformable属性存储数组
  2. 使用多对多关系,我读过这种关系是更“合法”的方式。
  3. 我应该使用哪一个?为什么?我将如何与我的简单结构实现多对多的关系?我似乎无法用手指围绕这个概念。

3 个答案:

答案 0 :(得分:4)

使用多对多关系。因为在获取请求期间它更好更容易。请参阅下面的屏幕截图。注意右侧的关系管理器,从NoteObject到Tags设置“To-Many Relationship”。忽略玩家实体。

哦,注意“删除规则”。您可能希望删除与给定NoteObject关联的所有标记。因此,在这种情况下将其设置为Cascade。

NoteObject实体enter image description here

标记实体enter image description here

- 编辑:

要添加多个标记,您需要首先获取NoteObject - 我假设会有某种ID参数用于区分NoteObject。 CoreData将自动为Tags生成添加/删除方法。您需要使用类似于下面的代码:

- (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];
}

答案 1 :(得分:1)

您可以使用可转换属性,但是您需要编写转换器。

如果使用toMany关系,则必须为标记创建一个附加实体,可能只有一个属性 - 字符串值和单个关系。稍微推断一下,我猜你有一组有限的值标签可以承担,你可能有一天会想要所有带有标签X的注释 - 然后你就可以获取包含X的字符串值的实体然后使用那就是获取关系中具有X的对象的NSArray(无论你怎么称呼它)。

答案 2 :(得分:1)

在Core Data中,数组只是很棘手,因为它们在iOS 5之前不受支持,所以你必须包含一些属性(比如创建日期),以便对它们进行排序。如果您不介意要求iOS 5,可以使用ordered relationships。结果在NSOrderedSet中返回,它与数组非常相似(并且可以转换为数组)。或者,只是重新思考问题 - 是对笔记或用户重要的笔记上的标签顺序?如果你只是按字母顺序显示标签会没关系吗?如果是这样,那就更好了 - 只使用一个普通的(无序的)多对多关系。