Core data 核心数据获取属性和NSFetchedResultsController

Core data 核心数据获取属性和NSFetchedResultsController,core-data,nsfetchedresultscontroller,fetched-property,Core Data,Nsfetchedresultscontroller,Fetched Property,我在《核心数据编程指南》中读到了这一点: 在许多情况下,您的初始获取会检索对象图中的起始节点,此后您不执行获取请求,只需遵循关系即可 如果所有对象都链接到一个对象,则这是有意义的 但是,假设我有这个对象模型和关系 公司(一对多)团队(一对多)员工(一对一)角色 假设我一开始就用一个获取请求加载我的公司。然后我可以访问一组团队,在每个团队中我都有一组员工 (这都是假设,但我的应用程序遵循相同的模型) 我想加载一个UITableView,其中列出了所有具有“开发人员”角色的员工,我想使用NSFetc

我在《核心数据编程指南》中读到了这一点:

在许多情况下,您的初始获取会检索对象图中的起始节点,此后您不执行获取请求,只需遵循关系即可

如果所有对象都链接到一个对象,则这是有意义的

但是,假设我有这个对象模型和关系

公司(一对多)团队(一对多)员工(一对一)角色

假设我一开始就用一个获取请求加载我的公司。然后我可以访问一组团队,在每个团队中我都有一组员工

(这都是假设,但我的应用程序遵循相同的模型)

我想加载一个UITableView,其中列出了所有具有“开发人员”角色的员工,我想使用NSFetchedResultsController来实现这一点

我想在公司上创建一个获取的属性,返回所有“开发者”。这很容易


如何将此获取的属性链接到NSFetchedResultsController?

我不确定是否理解您的问题,但如果您想将NSFetchedResultsController与UITableView一起使用,您必须使用NSFetchRequest,您不能只遵循关系,即使用错误处理

似乎您已经有了一个获取请求,要将其与获取的控制器一起使用,您必须将该请求传递给NSFetchedResultsController

但是,您可以通过查看实体描述及其属性来获取NSFetchedPropertyDescription:

NSEntityDescription *entityDescription = .....
然后可以调用属性并循环所有数组,直到找到属性:

NSArray *allProperties = entityDescription.properties;
NSFetchedPropertiesDescription *myPropertyDescription;
for(NSPropertyDescription *propertyDescription in allProperties) {
  // find it by name or class
  if([propertyDescription isKindOfClass:[NSFetchedPropertyDescription class]])
    myPropertyDescription = (NSFetchedPropertyDescription*)propertyDescription;
}

NSFetchedRequest *fetchRequest = [myPropertyDescription fetchRequest];

        NSFetchedResultsController *myController = [[NSFetchedResultsController alloc]
                                                 initWithFetchRequest:fetchRequest
                                                 managedObjectContext:myManagedObjectContext
                                                 sectionNameKeyPath:nil
                                                 cacheName:myCacheName];

我现在没有Mac,所以我无法测试代码的有效性,但它应该是正确的。

文档所说的是,您使用fetch根据某个属性查找一组托管对象,然后通过遍历关系查找所有相关对象。这与在关系数据库中查找数据的方式有很大不同。由于关系是在构建对象图时硬编码的,因此与获取相比,遍历关系非常非常快,并且可以对任意关系建模

您很少(如果有的话)使用获取的属性来查找您可以直接走到的托管对象。获取的属性用于查找无法漫游到的对象,例如存储在另一个持久存储文件中的对象

要漫游关系,请使用关键路径。例如,要在模型中查找特定公司的所有员工,可以使用
teams.employees
的关键路径,并从特定公司对象开始。要查找开发人员,您可以沿着路径找到包含
developer
值的
Role
属性,类似于:
team.employees.Role.roleType

在您的特定情况下,如果您想要一个包含所有开发人员的表,则不会将fetch设置为
公司
实体,而是设置为
员工
实体。您可以使用带有键路径的谓词,例如
role.roleType==developer
。如果您想要某个公司中的所有开发人员,您可以使用如下谓词:`role.roleType==developer和team.company.name==aCompanyName

但是,最好是这样调整您的模型:

Company<-->>Team<-->>Employee<<-->Role

Company>Team>employeeum,这看起来很有趣,可能正是我需要的。今晚我将对此进行测试,并将跟进我的结果。谢谢。以下是从属性描述获取获取请求的更简洁的方法:`NSEntityDescription*entity=[NSEntityDescription entityForName:@“Application”inManagedObjectContext:self.coreDataStack.managedObjectContext];NSFetchRequest*request=[entity valueForKeyPath:@“propertiesByName.usageMetricsForType.fetchRequest”];另一个有趣的答案,因为我现在就是这样做的。但我觉得我需要使用一个获取的属性。主要是因为我在《核心编程指南》中读到了这样一句话:“在许多情况下,您的初始获取会检索对象图中的起始节点,此后您不执行获取请求,只需遵循关系即可。”另外,因为我觉得我的代码中充满了NSFetchRequests,它们实际上不需要存在,因为我可以通过一个根对象的属性来访问它们。那么,在角色上添加一个带有谓词roleName==developer的fetched属性有什么错呢?主要是为了方便访问它?这会比生成NSFetchRequest更有效吗?您误解了文档。您不会构建只有一个对象的对象图。相反,对象图就像一堆珠子项链,其中每个珠子都是一个对象,字符串就是关系。使用fetch在每个无颈上查找珠子,然后使用“跟随字符串”查找相关珠子。换句话说,整个对象图由许多较小的图组成,这些图不一定相互连接。使用回迁在每个小图形中获取一个对象,然后遍历关系。回迁属性不会像关系那样自动更新。您必须手动刷新对象才能再次运行提取。这使得维护准确的最新图表变得困难。获取的属性只能在无法使用关系的情况下使用。是的,我接受了你的建议,暂时避开它们,因为它们不是我所需要的。谢谢(将另一个标记为答案,因为它实际上回答了我的最后一个问题“如何将此获取的属性链接到NSFetchedResultsController?”)。谢谢你的建议。