setPropertiesToFetch似乎没有任何效果

时间:2009-12-07 16:06:48

标签: iphone core-data

我正在尝试在我的获取请求中使用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]];

fetch似乎返回每个对象的相同数据,有或没有最后一行。有什么想法吗?

4 个答案:

答案 0 :(得分:8)

setPropertiesToFetch:文档的特殊注意事项部分

  

仅当resultType设置为NSDictionaryResultType时才使用此值。

您的代码段未设置resultType。也许您打算使用setRelationshipKeyPathsForPrefetching:?

答案 1 :(得分:2)

我所拥有的印象(来自Apple工程师所说的)是,只要您使用该属性的访问器,就会对非获取属性的数据进行故障处理。可能是在生成NSManagedObject的描述时,这些访问器被用于每个属性,导致数据在生成描述对象的字符串之前就出现故障。

您可以尝试使用Core Data Faults和/或Core Data Cache Misses仪器(在模拟器中)查看故障实际发生的时间。如果它们在您打印出托管对象之前发生,那似乎支持我上面的猜测。

答案 2 :(得分:0)

尝试 setReturnsDistinctResults:是

来自apple docs:

setReturnsDistinctResults:

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

  • (无效)setReturnsDistinctResults:(BOOL)值

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

答案 3 :(得分:-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"];

结果不是人物对象的数组,而是词典的数组。你可以像这样访问里面的词典

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

如果您只想使用Model对象(CoreData获取实体的所有属性/属性),您可以使用Person和PersonDetail设计模型(其中包含有关人员的详细信息)。这样

  
      
  • 您可以执行fetchRequest并获取Person对象数组
  •   
  • 访问aPerson.detail(详细信息是与PersonDetail的一对一关系)时,CoreData会为您执行故障
  •