核心数据 - 如何跟踪实体集的子集

Posted

技术标签:

【中文标题】核心数据 - 如何跟踪实体集的子集【英文标题】:Core Data - How to track subset of set of entities 【发布时间】:2014-03-20 22:55:43 【问题描述】:

我是核心数据的新手,正在寻找可能是一个简单问题的指导:

我有一组实体,每个实体可能属于也可能不属于某个集合。我希望能够以最有效的方式检索属于该集合的那些。我应该如何设置?

让我们更具体一点。假设有争议的实体是一个人。我的数据存储中有许多不同的 Person 实体。其中一些人为 Apple 工作。我经常只想检索那些为 Apple 工作的人员。我应该如何设置?

基于我对 Core Data 的幼稚理解,我有两种选择。 (1) 创建另一个名为 AppleEmployees 的实体,它与 Person 具有一对多关系,并在必要时将 Persons 添加到 AppleEmployee 实体中。或者 (2) 在 Person 实体上创建一个属性来跟踪该 Person 的雇主,并相应地过滤获取请求。

注意:我不担心跟踪许多不同的雇主(继续比喻)。一个人要么为苹果工作,要么不为苹果工作;我的关键问题是能够找到苹果员工。 :)

所以我的问题归结为:这些方法可行吗?如果是这样,哪个是最好的?有没有更好的方法?

【问题讨论】:

【参考方案1】:

我会使用 Company 和 Persons 托管对象来执行此操作。然后给定一家名为“Apple”的公司:

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Company"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@", @"Apple"];
[request setPredicate:predicate];

NSArray *results = [managedObjectContext executeFetchRequest:request error:nil];
Company *apple = [results lastObject];
NSSet *applePeople = apple.employees;

集合 applePeople 是所有 Person 管理对象的集合,与名称为“Apple”的公司有员工关系(这里没有错误检查...如果使用它,请添加一些。)

公司管理对象:

属性“名称”,NSString *

关系:员工,对许多人,对人,NSSet *

个人管理对象:

属性:“名称”,NSString *

属性:“employeeNumber”,NSString *

关系:Company

中的公司,对一,员工关系的倒数

你可以改变这个。您可能会考虑同时为多家公司工作并且与许多公司有公司关系的承包商。

【讨论】:

感谢您快速而彻底的回复。您的回答强化了我对 Core Data 的了解。 :) 不过,让我问这个问题:假设我们唯一关心的结果集是那些为 Apple 工作的人和那些不为 Apple 工作的人——(我想我的比喻不适合强调这一点)——这会以任何方式改变你的实现吗? 我仍然会创建一个带有名称的 Company 对象。任何事情都有可能发生 - 如果有另一个部门分拆(如牛顿),您可能希望将这些员工包括在您的数据中,即使他们正式在另一家公司工作。保持它的通用性使您更有可能将您在此处所做的事情应用到其他项目中。我不认为将其更具体地针对一家公司会显着提高效率。 “我不认为将其更具体地用于一家公司会显着提高效率。”你对我的担心是正确的。感谢您的见解!

以上是关于核心数据 - 如何跟踪实体集的子集的主要内容,如果未能解决你的问题,请参考以下文章

如何跟踪 Google Cloud 公共数据集的变化?

实体框架 6:审计/跟踪更改

如何跟踪程序集的多个版本?

sas如何写赋值循环

内存高效结构,以原始顺序跟踪数组的子集

NSFetchedResultsController 部分名称 - 跟踪效率