Iphone 从NSFetchRequest检索单个对象
我想从我的核心数据存储中获取一个对象,这是我一直在使用的代码,但它返回一个对象数组。必须有一种更简单、更好的方法:Iphone 从NSFetchRequest检索单个对象,iphone,objective-c,core-data,Iphone,Objective C,Core Data,我想从我的核心数据存储中获取一个对象,这是我一直在使用的代码,但它返回一个对象数组。必须有一种更简单、更好的方法: NSFetchRequest *request= [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"Manufacturer" inManagedObjectContext:managedObjectContext]; NSPredica
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];
如果谓词总是获取多个结果:
- 细化谓词-不要忘记,您可以使用AND/OR之类的逻辑构建谓词,简单的相等很容易,但在您的情况下可能没有足够的选择性
- 只需从数组中选择所需的结果,这没什么大不了的-尽管如果这是可能的,也应该可以细化谓词
- 考虑重新组织您的数据模型,以便您可以细化谓词,以便只返回一个项
fetch总是返回一个数组,这是它的定义。但是,它可以是一个对象的数组。它将始终返回一个数组,但您可以使其更干净:
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。当您知道数组中将有一个对象,或者您不关心从数组中拉出什么对象时,这会使代码更干净
顺便说一句,你的财产名称应该以小写字母开头。我很惊讶编译器没有就此警告您。试试
fetchRequest.fetchLimit=1
。您仍然可以得到一个数组,但最多只能有一个对象。那么我得到的效果非常好:)感谢您的澄清,我的ManufacturerID将始终是唯一的,因此我应该全部设置。因此,当我需要数组中的所有元素时,我应该使用什么来代替mutableCopy?此外,在我的核心数据模型中,我只在实体的属性名称上使用大写字母,否则我使用小写字母。在问题中的代码中,您有ManufacturerID
,因此我对该部分的评论:)至于您的另一个副本,-executeFetchRequest:error:
返回一个数组。你不需要用它做任何其他事情。调用-mutableCopy
只会将其转换为NSMutableArray
,当您使用从核心数据返回的NSArray
时,它不会做任何有用的事情。添加到该数组不会将对象添加到核心数据中;从该数组中删除对象不会将其从核心数据中删除。[request setFetchLimit:1]可以限制返回对象的数量,尽管您仍将获得一个NSArray。我尝试了fetchLimit==1
以获取核心数据
对象。它根本不起作用