我想将NoteObjects
存储在Core Data中。通常情况下,NoteObject
有一个NSString *mainText
和一个NSMutableArray *arrayOfTags
(一个NSStrings
数组)。我现在想要使用核心数据,但数组是核心数据的棘手问题。通常,NoteObject
在其数组中不会有超过50个标记。那么我应该如何建模呢?我有两个选择:
transformable
属性存储数组我应该使用哪一个?为什么?我将如何与我的简单结构实现多对多的关系?我似乎无法用手指围绕这个概念。
答案 0 :(得分:4)
使用多对多关系。因为在获取请求期间它更好更容易。请参阅下面的屏幕截图。注意右侧的关系管理器,从NoteObject到Tags设置“To-Many Relationship”。忽略玩家实体。
哦,注意“删除规则”。您可能希望删除与给定NoteObject关联的所有标记。因此,在这种情况下将其设置为Cascade。
NoteObject实体
标记实体
- 编辑:
要添加多个标记,您需要首先获取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中返回,它与数组非常相似(并且可以转换为数组)。或者,只是重新思考问题 - 是对笔记或用户重要的笔记上的标签顺序?如果你只是按字母顺序显示标签会没关系吗?如果是这样,那就更好了 - 只使用一个普通的(无序的)多对多关系。