【问题标题】:Core Data Relationships - displaying only those values found in specific entities核心数据关系 - 仅显示在特定实体中找到的那些值
【发布时间】:2012-03-05 14:56:35
【问题描述】:

这是一个简单的问题,但我找不到答案。

我正在构建一个应用程序,用于存储有关项目和人员的数据,这些数据使用 Core Data 存储在 SQLite 数据库中。

一个项目可以有很多人,但是一个人只能分配给一个项目。我在表格视图中显示数据,此时,每当您查看任何项目时,它都会显示存储在数据库中的所有人员 - 这并不理想。

我只想显示参与该项目的人。我将如何以编程方式进行?这是使用过滤完成的吗?例如:

- (void)setupFetchedResultsController
{
    // 1 - Decide what Entity you want
    NSString *entityName = @"People"; // Put your entity name here
    NSLog(@"Setting up a Fetched Results Controller for the Entity named %@", entityName);

    // 2 - Request that Entity
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entityName];

    // 3 - Filter it if you want
    //request.predicate = [NSPredicate predicateWithFormat:@"people.name = someones name"];

    // 4 - Sort it if you want
    request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"lastName"
                                                                                     ascending:YES
                                                                                      selector:@selector(localizedCaseInsensitiveCompare:)]];
    // 5 - Fetch it
    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                                                        managedObjectContext:self.managedObjectContext
                                                                          sectionNameKeyPath:nil
                                                                                   cacheName:nil];


    [self performFetch];
}

【问题讨论】:

    标签: iphone objective-c ios uitableview core-data


    【解决方案1】:

    您需要一个谓词,它充当过滤器。请参阅 NSPredicate 上的文档。

    谓词必须引用您感兴趣的项目。从您展示的少量代码中,您可能会尝试这样的事情(细节取决于您自己的实现)。

    request.predicate = [NSPredicate predicateWithFormat:@"people.project = %@", projectName"];
    

    【讨论】:

    • Jim 和 A Salcedo 的回答都很好,但是 Jim 的回答对我来说最有意义,谢谢。
    • 要补充一点,我是否会将 Core Data 模型视为数据库并在 People 实体中创建另一个名为 projects 的属性?或者有没有更好的处理关系的方法
    • 我应该先看看你的实体结构。我假设项目之类的东西已经是您的人员实体的一部分。如果您编辑显示人员实体的头文件的问题,我也许可以给您一个答案。 Core Data 实现了一个有向图(我认为关系数据库的另一个名称)。所以,是的,它是一个数据库。另外,显示您的项目实体(如果项目是您的人员实体的关系属性,我假设有一个。)
    • Jim,目前我在 Person 中的唯一属性是名字和姓氏,因为这是一个早期版本。我是否需要创建一个名为 project 的新属性,以及设置 Project 和 Person 实体之间的关系?所以当一个新人被保存时,所引用的项目也被存储在他们旁边。
    • 如果你想在你的数据库中有项目信息,你可以将人们绑定到,那么,是的,你创建一个项目实体和项目之间的关系 > 人(一对一可能很多)。或者您可以只使用带有项目名称的字符串属性,但这不会有关系数据库(或对象图)的好处。祝你好运。
    【解决方案2】:

    首先,我假设您的存储程序是正确的,并且您正在正确地建立您的关系。

    其次,如果您想在特定项目中获取人员,最简单的方法可能是将项目设置为获取实体。

    这样,您所要做的就是为所需项目设置谓词,然后从该托管对象中,您应该为该项目中的人员提供一个 NSSet。从那组开始,您要如何处理信息由您决定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多