我在核心数据中有这种基本的一对多关系:
我正在解析来自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)会多次调用此函数。
行为是这样的:
有没有人注意到我做错了什么?
答案 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];
}