基于实体关系的核心数据获取

Posted

技术标签:

【中文标题】基于实体关系的核心数据获取【英文标题】:Core Data Fetch Based on Entity Relationship 【发布时间】:2013-07-21 22:42:56 【问题描述】:

我正在尝试从 Core Data 调用与特定类别相关的所有内容。应用是这样的:

点击一个类别 点击子类别问题 查看问题

我已经设置了所有视图,并让合作伙伴设置了 Core Data,但我遇到了一个问题,即无论我选择哪个类别,它仍然总是加载所有问题。

我从类别列表视图传递了类别选择,但我不确定如何处理它,以及我应该如何从 Core Data 调用。我目前有这个(同样,它返回所有问题):NSEntityDescription *entity = [NSEntityDescription entityForName:@"Question" inManagedObjectContext:[appDelegate managedObjectContext]];

类别和问题在数据模型中具有反比关系。我应该使用谓词、NSRelationshipDescription 还是其他什么?

【问题讨论】:

你的数据模型是什么样的?类别、子类别和问题是否有单独的托管对象? @bbarnhart 是的,单独的对象,两者之间有关系。 【参考方案1】:

您不能只访问NSSet 的问题吗?即category.questions

回答关于谓词的问题:

如果您要查找特定Category 的所有Questions,则需要在NSPredicate 中指定Category

类似:

(NSArray *)findQuestionsForCategory:(Category *)category 
NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Question" inManagedObjectContext:[appDelegate managedObjectContext]];
[fetch setPredicate:[NSPredicate predicateWithFormat:@"question.category == %@", category]];

... execute fetch request, handle possible errors ...


【讨论】:

【参考方案2】:

使用 NSPredicate(假设您使用的是传统的 Master-Detail UITableView 模式和情节提要):

// In CategoryViewController
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    if ([[segue identifier] isEqualToString:@"categorySelect"])
    
        Category *category;
        category = [categories objectAtIndex:[self.tableView indexPathForSelectedRow].row];
        [segue.destinationViewController setParentCategory:category];
    


// In QuestionViewController with @property parentCategory
- (void)viewDidLoad

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Question" inManagedObjectContext:managedObjectContext];
    [fetchRequest setEntity:entity];

    // Create predicate
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(category == %@)", self.ParentCategory];
    [fetchRequest setPredicate:predicate];

    NSError *error;
    questions = [managedObjectContext executeFetchRequest:fetchRequest error:&error];

【讨论】:

以上是关于基于实体关系的核心数据获取的主要内容,如果未能解决你的问题,请参考以下文章

获取“最新”单个实体的最简单 Fetch 请求 - 核心数据

核心数据。无法根据与继承实体的关系来获取/排序实体

核心数据:以一对多的关系获取实体的获取请求

从具有实体之间关系的核心数据中获取数据[重复]

获取核心数据中一对多关系的计数

仅在父子实体具有 1 到 M 关系的核心数据中获取父实体的数据