搜索CoreData关系

时间:2013-02-26 05:30:54

标签: objective-c core-data nspredicate nsmanagedobject nsfetchrequest

我准备把头发拉出来试图弄清楚为什么这不起作用。

我有两个实体:

Quote

Customer

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

+ (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>'

谓词设置错了吗?阅读文档说,您可以使用点语法来访问谓词中的属性。

请帮忙......

2 个答案:

答案 0 :(得分:3)

原来缺乏睡眠,@ Gary引导我找到正确的答案。

  1. 我应该有一个从客户到Quote的多对多关系。

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

  3.   

    NSPredicate * predicate = [NSPredicate predicateWithFormat:@“ANY   customer ==%@“,objectID];

答案 1 :(得分:1)

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