Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 从NSFetchRequest检索单个对象_Iphone_Objective C_Core Data - Fatal编程技术网

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
以获取
核心数据
对象。它根本不起作用