iPhone - 从Core Data获取数组而不是一组字典

时间:2011-02-14 11:44:27

标签: iphone core-data

我的核心数据类中有类似的东西从数据库中获取所有类型的“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中做到这一点?

感谢

2 个答案:

答案 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];
相关问题