2011-02-14 3 views
1

내가 배열로 데이터베이스에서 종류 "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... 

I의 ... 대신에, 단지 값을 포함하는 배열을 받고 싶습니다 이 것을 받고 싶습니다

array {object1, object2, ... 

거기에 가져 오기를 수행하는 방법이 있습니까?

감사

답변

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; 
} 

사용이.

+0

하지만,이 문제는 다음과 같이 중첩 된 오토 릴리즈 풀에 allDataInManagedObjectContext:에 대한 호출을 둘러싸에 의해 제거 될 수있다. – SpaceDog

1

내가 특히는 대상체 당 NSDictionaryResultType returns an array of dictionaries 번 사전에 페치의 설명은이 문제를 알. (즉 생각해 보면 분명있을 수 있습니다,하지만 애플 문서의 아무 곳이나 철자가 아닙니다.)

의 경우 사람에

다른 사람이보고되어, 거의 정확하게 디지털 로봇 요청을하는 방법이있다 :

전자 return [allData valueForKey:@"dataX"];

이 어레이의 사전 요소로 파고 각 사전에서 지정된 키 값의 배열을 반환 간지있는 NSArray 방법 valueForKey:, 이용한다 return allData;으로 대체.

유일한 단점은 페치에 의해 반환 된 모든 사전 포인터가 메모리를 차지한다는 것이다. 어쨌든, 덕분에 나는 스스로를 가져 오기에 그것을하는 방법의 일종으로 생각

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];