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

Posted

技术标签:

【中文标题】如何为我的核心数据实体建模?【英文标题】:How to model my Core Data entity? 【发布时间】:2012-03-15 18:34:51 【问题描述】:

我想将NoteObjects 存储在 Core Data 中。通常,NoteObject 具有 NSString *mainTextNSMutableArray *arrayOfTagsNSStrings 的数组)。我现在想使用核心数据,但是数组对于核心数据来说是一件棘手的事情。通常,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 中返回,它很像(并且可以转换为)数组。或者,只是重新考虑问题——笔记上的标签顺序对笔记或用户重要吗?如果您只是按字母顺序显示标签可以吗?如果是这样,那就更好了——只需使用简单的旧(无序)对多关系。

【讨论】:

以上是关于如何为我的核心数据实体建模?的主要内容,如果未能解决你的问题,请参考以下文章

如何为多个应用程序建模核心业务逻辑和专业化?

如何为对象计数多个关系创建谓词?核心数据 iOS Swift

如何为简单的应用程序设置核心数据模型?

实体名称更改时核心数据建模器不更新

核心数据模型 - 关系

核心数据模型 - 实体和逆