从NSFetchRequest中检索单个对象

Sle*_*lee 6 iphone core-data objective-c

我想从我的核心数据数据库获取单个对象,这里是我一直在使用的代码,但它返回对象的数组.必须有一个更简单,更好的方法:

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];
Run Code Online (Sandbox Code Playgroud)

Ada*_*ach 8

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

  • 改进谓词 - 不要忘记你可以用AND/OR之类的逻辑构建谓词,简单的相等很容易,但在你的情况下可能不够有选择性.

  • 只需从数组中选择你想要的结果,这没什么大不了的 - 虽然如果这是可能的,也应该可以优化谓词......

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

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


Mar*_*rra 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]);
Run Code Online (Sandbox Code Playgroud)

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

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