搜索 CoreData 关系

Posted

技术标签:

【中文标题】搜索 CoreData 关系【英文标题】:Searching CoreData relationships 【发布时间】:2013-02-26 05:30:53 【问题描述】:

我正想弄清楚为什么这不起作用。

我有两个实体:

Quote

Customer

QuoteCustomer 具有一对一的关系属性,简称为“customer”。客户有一个 CoreData objectID(显然)。我正在尝试搜索所有报价,并根据CustomerobjectID 返回与特定客户相关联的报价。通读所有教程,我设法得到了这个,但我一直在崩溃:

+ (void)fetchQuotesForCustomerID:(NSManagedObjectID*)objectID results:(void(^)(NSError* error, NSArray *fetchedResults))completion 

    NSManagedObjectContext *context = [[QuoteGenerator sharedGenerator] managedObjectContext];

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

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"customer.objectID == %@", objectID];

    [fetchRequest setPredicate:predicate];

    NSError *error;

    NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];

    if (error) 
        NSLog(@"fetch error = %@", [error localizedDescription]);
        completion(error, nil);
     else 
        NSLog(@"fetch count = %d", fetchedObjects.count);
        completion(nil, fetchedObjects);
    

输出错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'keypath customer.objectID not found in entity <NSSQLEntity Quote id=13>'

谓词设置是否错误?通读文档是说您可以使用点语法来访问谓词中的属性。

请帮忙...

【问题讨论】:

如果一个客户可以有多个报价,为什么不使用一对多的关系并简单地使用核心数据来查找相关的报价对象? @Gary 谢谢你的帮助。引导我找到正确的答案! 【参考方案1】:

原来是睡眠不足,@Gary 引导我找到正确答案。

    我应该有一个从客户到报价的一对多关系。

    在比较实体 NSManagedObjectID 属性时,您不必明确声明它。因此,对NSPredicate 的以下修改解决了我的问题。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY 客户 == %@", objectID];

【讨论】:

【参考方案2】:

您根本不需要进行提取,核心数据应该在您的客户对象上生成一个报价成员,该成员将返回所有相关报价对象的 NSSet。

【讨论】:

你的权利!经过一夜的休息后,一切都开始了 :) 感谢您的帮助 如果没有获取请求,您将失去方便的 fetchedResultsController,它为您提供了处理更新和内容的绝佳机会。这就是为什么我选择下面的解决方案。

以上是关于搜索 CoreData 关系的主要内容,如果未能解决你的问题,请参考以下文章

CoreData - 在实体上有许多关系时的性能

CoreData - 不在 NSSet 上保存关系或外键详细信息

Swift CoreData,通过多对多关系保存数据

CoreData父、母子关系,一个CoreData子类可以和两个子类有相同的关系吗?

通过 UISearchBar 使用 CoreData 过滤查询

CoreData:通过关系访问对象