我正在尝试在我的获取请求中使用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似乎返回每个对象的相同数据,有或没有最后一行。有什么想法吗?
答案 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指定的字段的不同值。
参数 值 如果是,则请求仅返回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会为您执行故障