我的核心数据类中有类似的东西从数据库中获取所有类型的“dataX”数据,作为一个数组......
+ (NSArray *)allDataInManagedObjectContext:(NSManagedObjectContext *)context
{
NSArray *allData = nil;
NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = [NSEntityDescription entityForName:@"myData" inManagedObjectContext:context];
[request setResultType:NSDictionaryResultType];
[request setReturnsDistinctResults:YES];
[request setPropertiesToFetch:[NSArray arrayWithObject:@"dataX"]];
NSError *error = nil;
allData = [context executeFetchRequest:request error:&error];
[request release];
return allData;
}
问题是这会返回一个字典数组,在这种情况下,每个字典只包含一对对象/键。
由于该数组上所有字典上的所有键都等于“dataX”,我希望收到一个只包含值的数组...所以代替这个
array { dictionary1, dictionary2...
dictionary1 = one object for key "dataX" (lets call it object1)
dictionary2 = one object for key "dataX" (lets call it object2)
etc...
我想收到这个
array {object1, object2, ...
有没有办法在fetch中做到这一点?
感谢
答案 0 :(得分:3)
+ (NSMutableArray *)allDataInManagedObjectContext:(NSManagedObjectContext *)context
{
NSMutableArray *allData = [NSMutableArray array];
NSMutableArray *returnableArray=[NSMutableArray array];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = [NSEntityDescription entityForName:@"myData" inManagedObjectContext:context];
[request setResultType:NSDictionaryResultType];
[request setReturnsDistinctResults:YES];
[request setPropertiesToFetch:[NSArray arrayWithObject:@"dataX"]];
NSError *error = nil;
allData = [[context executeFetchRequest:request error:&error] mutableCopy];
[request release];
for(int i=0;i<[allData count];i++)
{
[returnableArray addObject:[[allData objectAtIndex:i] valueForKey:@"dataX"]];
}
return returnableArray;
}
使用它。
答案 1 :(得分:1)
我特别感谢这个问题的解释,即使用NSDictionaryResultType returns an array of dictionaries
进行提取,每个目标对象一个字典。 (回想起来,这可能是显而易见的,但在Apple文档的任何地方都没有详细说明。)
如果有人正在考虑这个问题,那么有一种方法几乎可以完成数字机器人的要求:
只需将return allData;
替换为return [allData valueForKey:@"dataX"];
这使用了漂亮的NSArray方法valueForKey:
,它挖掘了数组的字典元素,并从每个字典中返回指定键的值数组。
唯一的缺点是fetch返回的所有字典指针都占用了内存。通过将对allDataInManagedObjectContext:
的调用封装在嵌套的自动释放池中可以消除此问题,如下所示:
NSAutoreleasePool *subpool = [[NSAutoreleasePool alloc] init];
NSArray *arrayOfValuesDesired = [NameOfClassDefiningStaticMethod allDataInManagedObjectContext:theContext];
// Loop through the array, calling “retain” on each of its elements, and then add a routine to this class’s dealloc method that releases each element.
self.aPropertyThatRetainsItsValues = arrayOfValuesDesired;
[subpool drain];