executeFetchRequest不使用propertiesToFetch

时间:2014-02-20 12:50:04

标签: ios objective-c core-data nsmanagedobjectcontext nsfetchrequest

我已在我的应用程序中集成了coreData。我在主线程中运行NSManagedObjectContext

-(NSArray *) getResultForContext:(NSManagedObjectContext *)context
{

    NSFetchRequest *request = [[NSFetchRequest alloc]initWithEntityName:@"Person"];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:context];
    [request setEntity:entity];

    NSError *fetchError;
    NSArray *allObjects = [self executeFetchRequest:request error:&fetchError];

    return allObjects;
}

上述方法工作正常,但如果我向请求添加propertiesToFetchexecuteFetchRequest将返回一个空数组。

-(NSArray *) getResultForContext:(NSManagedObjectContext *)context
{

    NSFetchRequest *request = [[NSFetchRequest alloc]initWithEntityName:@"Person"];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:context];
    [request setEntity:entity];

    [request setResultType:NSDictionaryResultType];
    [request setReturnsDistinctResults:YES];
    [request setPropertiesToFetch:@[@"firstName",@"lastName"]];
    NSError *fetchError;
    NSArray *allObjects = [self executeFetchRequest:request error:&fetchError];

    return allObjects;
}

此方法返回空。

这里缺少什么?

2 个答案:

答案 0 :(得分:0)

假设(1)数据存在(即实际上有一些Person个实例要被提取)并且(2)结果实际上是一个空数组而不是nil

我知道在第一种情况下获取非空数组但在第二种情况下为空数组的唯一方法是,如果列出的属性对于所有实例都是nil 。在这种情况下,没有值,因此对setReturnsDistinctResult的调用会有效地过滤掉每个结果(因为nil不被视为不同的结果)。

如果任何现有nil实例的任何一个属性都是非Person,那么您将得到一个非空数组。但是如果没有要获取的属性值,则没有明显的结果,结果为空。

如果结果实际上是nil,而不是空数组,请查看fetchError以获取线索。

答案 1 :(得分:0)

问题来自NSDictionaryResultType。 正如在this post上所说的bbarnhart,在使用resultType NSDictionaryResultType之前,必须将上下文保存到持久存储。

请注意上下文persistentStoreCoordinator的声明。