如何为我的核心数据实体建模?
Posted
技术标签:
【中文标题】如何为我的核心数据实体建模?【英文标题】:How to model my Core Data entity? 【发布时间】:2012-03-15 18:34:51 【问题描述】:我想将NoteObjects
存储在 Core Data 中。通常,NoteObject
具有 NSString *mainText
和 NSMutableArray *arrayOfTags
(NSStrings
的数组)。我现在想使用核心数据,但是数组对于核心数据来说是一件棘手的事情。通常,NoteObject
的数组中的标签不会超过 50 个。那么我应该如何建模呢?我有两个选择:
-
使用
transformable
属性来存储数组
使用多对多关系,我认为这是更“合法”的方式。
我应该使用哪一个,为什么?我将如何用我的简单结构实现一对多关系?我似乎无法理解这个概念。
【问题讨论】:
你确定 CoreData 是正确的方法 - 如果你的数据足够小,你看过 NSCoding 吗?如果您有大量数据集,请按照@Eugene 的答案进行操作:) 【参考方案1】:使用多对多关系。因为它在获取请求期间更好更容易。请参阅下面的屏幕截图。注意右侧的关系管理器,将NoteObject中的“To-Many Relationship”设置为Tags。忽略 Player 实体。
哦,注意“删除规则”。您可能想要删除与给定 NoteObject 关联的所有标签。所以在这种情况下将其设置为 Cascade。
NoteObject entity
标记实体
--编辑:
要添加多个标签,您需要首先获取您的 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];
【讨论】:
那么现在我如何向一个笔记对象添加多个标签? @mohabitar 修改了答案 太棒了,谢谢。另外,我是否必须为 Tag 实体生成类文件? 另外,在第二个屏幕截图中,To-Many 关系未选中。对吗? @mohabitar 是的,您必须为这两个实体创建类文件。是的,Tag 实体仅与 NoteObject 的主对象相反。【参考方案2】:您可以使用可转换的属性,但是您需要编写转换器。
如果您使用 toMany 关系,则必须为标签创建一个附加实体,该实体可能只有一个属性 - 字符串值和一个关系。稍微推断一下,我猜你有一组有限的值标签可以接受,你可能有一天想要所有带有标签 X 的笔记 - 然后你将能够获取包含 X 的字符串值的实体,然后使用用于获取关系中具有 X 的对象的 NSArray(无论您如何称呼它)。
【讨论】:
【参考方案3】:数组只是在 Core Data 中比较棘手,因为它们在 ios 5 之前不受支持,因此您必须包含一些属性(如创建日期),以便对它们进行排序。如果您不介意需要 iOS 5,可以使用ordered relationships。结果在 NSOrderedSet 中返回,它很像(并且可以转换为)数组。或者,只是重新考虑问题——笔记上的标签顺序对笔记或用户重要吗?如果您只是按字母顺序显示标签可以吗?如果是这样,那就更好了——只需使用简单的旧(无序)对多关系。
【讨论】:
以上是关于如何为我的核心数据实体建模?的主要内容,如果未能解决你的问题,请参考以下文章