从NSFetchRequest中检索单个对象

时间:2010-08-10 22:20:47

标签: iphone objective-c core-data

我想从我的Core Data数据存储区中获取一个对象,这是我一直在使用的代码,但它返回一个对象数组。必须有一个更简单,更好的方法:

NSFetchRequest *request= [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Manufacturer" inManagedObjectContext:managedObjectContext];
NSPredicate *predicate =[NSPredicate predicateWithFormat:@"ManufacturerID==%@",[[mitems objectAtIndex:i] objectForKey:@"ManufacturerID"]];
[request setEntity:entity];
[request setPredicate:predicate];

NSError *error;
NSArray *entities = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];

3 个答案:

答案 0 :(得分:8)

如果您的谓词总是获取多个结果:

  • 优化谓词 - 不要忘记你可以使用AND / OR这样的逻辑构建谓词,简单的相等很容易,但在你的情况下可能不够有选择性。

  • 只需从数组中选择您想要的结果,这没什么大不了的 - 尽管如果可行的话也应该可以优化谓词......

  • 考虑重新组织您的数据模型,以便您可以优化谓词以仅返回一个项目。

fetch总是返回一个数组,即它的定义。但它可以是一个对象的数组。

答案 1 :(得分:6)

它总会返回一个数组,但你可以使它更清洁:

NSFetchRequest *request= [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Manufacturer" inManagedObjectContext:managedObjectContext];
NSPredicate *predicate =[NSPredicate predicateWithFormat:@"ManufacturerID==%@",[[mitems objectAtIndex:i] objectForKey:@"ManufacturerID"]];
[request setEntity:entity];
[request setPredicate:predicate];

NSError *error;
//Making a mutable copy here makes no sense.  There is never a reason to make this mutable
//NSArray *entities = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
id manufacturer = [[managedObjectContext executeFetchRequest:request error:&error] lastObject];
request = nil;
NSAssert1(error && !manufacturer, @"Error fetching object: %@\n%@", [error localizedDescription], [error userInfo]);

-lastObject将返回数组中的最后一项,如果数组为空,则返回nil。当你知道数组中会有一个对象或者你不关心从数组中取出什么对象时,这可以使你的代码更清晰。

顺便说一下,你的房产名称应以小写字母开头。令我感到惊讶的是,编译器没有对此发出警告。

答案 2 :(得分:1)

试试fetchRequest.fetchLimit = 1。你仍然得到一个数组,但最多只有一个对象。