核心数据。对同一对象的后续提取返回null

时间:2011-12-24 14:25:47

标签: objective-c core-data ios5 null nsfetchrequest

我在核心数据中有这种基本的一对多关系:

  • 品牌有N个产品
  • 产品有1个品牌(与之前的反向关系)

我正在解析来自WS的产品。当产品问世时,我需要将其品牌添加到新创建的产品中。

为此,我需要获取品牌并将其分配给产品。

+ (Brand *) getBrandWithId : (int) brand {
    NSManagedObjectContext * context = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];

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

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"id == %@", [[NSNumber numberWithInt:brand]description]];
    [fetchRequest setPredicate:predicate];

    NSError *error = nil;
    NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
    for (Brand * brand in fetchedObjects) {
        return brand;
    }
    return nil;
}

当一个产品紧挨着另一个产品时,相同的品牌(相同的ID)会多次调用此函数。

行为是这样的:

  • 首次调用时,正确获取Brand并通过此函数返回。
  • 第二次(以及之后的时间),对于之前的同一品牌,该功能将返回nil。

有没有人注意到我做错了什么?

1 个答案:

答案 0 :(得分:3)

NSError *error = nil;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
for (Brand * brand in fetchedObjects) {
    return brand;
}

这段代码看起来很奇怪。首先,您传入的是NSError **,但忽略了可能返回的错误。由于你的fetch似乎遇到了一些问题,检查它是否有意义。

其次,for循环似乎有误导性。由于正文包含return语句,因此您永远不能多次执行循环。虽然没有实际的区别,但似乎更好地表明了这里的意图:

if (fetchedObjects != nil) {
    return [fetchedObjects objectAtIndex:0];
}