2009-12-07 120 views
6

我想在我的提取请求中使用setPropertiesToFetch来限制从我的商店检索到的数据,但它似乎没有效果。当我使用它并显示返回到控制台的对象时,我可以看到我的所有属性都在那里。无论是否设置属性,都会显示相同的数据。所有关系都显示为故障,但属性的所有数据都在那里。setPropertiesToFetch似乎没有任何效果

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Entity" inManagedObjectContext:context]; 
NSDictionary *entityProperties = [entity propertiesByName]; 
[fetchRequest setEntity:entity]; 
[fetchRequest setFetchBatchSize:20]; 
[fetchRequest setIncludesPendingChanges:NO]; 
[fetchRequest setReturnsObjectsAsFaults:NO]; 
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:[entityProperties objectForKey:@"myAttrib"], nil]]; 

该提取似乎返回每个对象相同的数据有或没有最后一行。有任何想法吗?

回答

2

我曾经(从苹果工程师所说的)的印象是,只要您使用该属性的访问器,数据就会在未提取的属性中发生错误。可能是在生成NSManagedObject的描述时,这些访问器正在用于每个属性,导致数据在描述对象的字符串生成之前发生错误。

您可以尝试使用核心数据故障和/或核心数据高速缓存未命中工具(在模拟器中)查看故障实际发生的时间。如果它们在打印出管理对象之前发生,那么这似乎支持我上面的猜测。

+0

是的,我真的以为。但是当关系错误被显示时,我认为描述会显示属性错误。有趣的,我会看看那个!谢谢! – 2009-12-07 19:41:19

+0

我有一个简单的问题。出于某种原因,它不允许多对多关系,只允许属性和1-1关系。这是正确的还是我碰到某种错误?我得到: '对许多关系无效...传递给setPropertiesToFetch:' – 2009-12-10 16:11:07

+0

从-setPropertiesToFetch文档:“属性描述可能表示属性,一对一关系或表达式。”我认为对于多对多的关系,他们推荐使用-setRelationshipKeyPathsForPrefetching: – 2009-12-10 18:06:15

8

setPropertiesToFetch:文件的特殊注意事项部分说,如果与resultType设置为NSDictionaryResultType

此值仅使用。

你的代码片段没有设置resultType。也许你打算使用setRelationshipKeyPathsForPrefetching:?

+0

现在您可以将它用于对象 – malhal 2016-10-12 16:29:58

0

尝试setReturnsDistinctResults:YES

从苹果文档:

setReturnsDistinctResults:

设置请求是否应该由propertiesToFetch指定的字段只返回不同的值。

  • (无效)setReturnsDistinctResults:(BOOL)值

参数 值 如果是YES,则该请求只返回由propertiesToFetch指定的字段不同的值。

-1

setPropertiesToFetch使用

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:context]; 
[fetchRequest setEntity:entity]; 
[fetchRequest setResultType:NSDictionaryResultType]; // Remember to setResultType 
[fetchRequest setPropertiesToFetch: 
[NSArray arrayWithObjects:@"name", @"age", nil]]; 
NSArray *results = [self.managedObjectContext executeFetchRequest:fetchRequest 
                   error:nil]; 

NSArray *nameArray = [results valueForKey:@"name"]; 
NSArray *ageArray = [results valueForKey:@"age"]; 

结果的正确的方法是不Person对象的阵列,但字典的阵列。你可以在里面访问字典这样

NSLog(@"%@", [results[0] valueForKey:@"name"]); 
NSLog(@"%@", [results[0] valueForKey:@"age"]); 

如果你只想与模型对象的工作(其CoreData获取所有属性/实体的attribues),你可以设计与人和PersonDetail(持有的细节您的模型关于一个人的信息)。这样

  • 可以执行fetchRequest并获得人对象的数组
  • 当访问aPerson.detail(具体是一个一对一的关系与PersonDetail),CoreData将执行断层为你
相关问题