2011-10-08 42 views
5

我試圖從NSPredicate中獲得不同的結果。具有不同屬性的NSFetchRequest

我的代碼:

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Members" inManagedObjectContext:context]; 
    request.entity = entity; 
    request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"city" 
                        ascending:YES 
                         selector:@selector(caseInsensitiveCompare:)]]; 

    request.predicate = [NSPredicate predicateWithFormat:@"memberDeleted == %@", [NSNumber numberWithBool:NO]]; 

    NSDictionary *properties = [entity propertiesByName]; 
    request.propertiesToFetch = [NSArray arrayWithObject:[properties objectForKey:@"city"]]; 
    request.returnsDistinctResults = YES; 

    request.fetchBatchSize = 20; 

    NSFetchedResultsController *frc = [[NSFetchedResultsController alloc] initWithFetchRequest:request 
                      managedObjectContext:context 
                      sectionNameKeyPath:nil 
                        cacheName:@"CityCache"]; 
    [request release]; 

    self.fetchedResultsController = frc; 
    [frc release]; 

的問題是,結果返回同一城市的許多倍。這個實體有很多成員,每個成員都有一個「城市」屬性。

我在做什麼錯?

感謝,

RL

回答

7

確保設置NSFetchRequestNSDictionaryResultTyperesultType。默認是返回實際的對象,所以它會忽略propertiesToFetch

+0

我也許應該補充一點'NSFetchedResultsController'不是一般的'NSDictionaryResultType'的粉絲。你可能會遇到其他問題,不得不放棄'NSFetchedResultsController'。 – Alex

+0

問題是我不想要結果和NSDictionary。如果沒有,我將不得不改變我的一些代碼。它可以通過其他方式嗎? –

+0

你期待它返回什麼對象?核心數據只能返回對象圖中實際存在的對象。 – Alex

6

隨着@Alex的幫助下,這裏的最終代碼,而無需FRC:

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Members" inManagedObjectContext:self.managedObjectContext]; 
request.entity = entity; 
request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"city" 
                       ascending:YES 
                        selector:@selector(caseInsensitiveCompare:)]]; 

request.predicate = [NSPredicate predicateWithFormat:@"memberDeleted == %@", [NSNumber numberWithBool:NO]]; 

NSDictionary *properties = [entity propertiesByName]; 
request.propertiesToFetch = [NSArray arrayWithObject:[properties objectForKey:@"city"]]; 
request.returnsDistinctResults = YES; 
request.resultType = NSDictionaryResultType; 
request.fetchBatchSize = 20; 

NSError *error = nil; 
NSArray *tempArray = [self.managedObjectContext executeFetchRequest:request error:&error]; 

NSMutableArray *cities = [[NSMutableArray alloc] init]; 
for (int i=0; i < [tempArray count]; i++){ 
    NSDictionary *tempDict = [NSDictionary dictionary]; 
    tempDict = [tempArray objectAtIndex:i]; 

    if ([tempDict objectForKey:@"city"] != nil) 
     [cities addObject:[tempDict objectForKey:@"city"]]; 
} 

//if the tempArray has no nil values, it's more efficient with: 
//NSArray* cities = [tempArray valueForKeyPath:@"city"]; 

self.cityArray = cities; 
[cities release]; 
[request release]; 

這返回的NSArray與城市名單。

謝謝。

+1

你可以更容易地做到這一點。只要這樣做:'NSArray * cities = [tempArray valueForKeyPath:@「city」];'這將獲得數組中每個字典的'city'的值,並將它們放入一個數組中。 – Alex

+1

@Alex,如果數組中沒有零值,則工作正常。如果有任何零值,它會崩潰。 –

+0

糟糕。在調查這個問題時,我提出了銳意的「崩潰」評論,並認爲這是一個很有價值的警告。但NSArray類參考文獻列出了一個稍微不同的方法,「valueForKey:」,它表示將爲零對象返回一個NSNull對象。所以應該沒有問題。 – Wienke

2

從官方文檔:

NSManagedObjectContext *context = <#Get the context#>; 

NSEntityDescription *entity = [NSEntityDescription entityForName:@"<#Entity name#>" inManagedObjectContext:context]; 

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
[request setEntity:entity]; 
[request setResultType:NSDictionaryResultType]; 
[request setReturnsDistinctResults:YES]; 
[request setPropertiesToFetch :[NSArray arrayWithObject:@"<#Attribute name#>"]]; 

// Execute the fetch. 
NSError *error; 
id requestedValue = nil; 
NSArray *objects = [managedObjectContext executeFetchRequest:request error:&error]; 
if (objects == nil) { 
    // Handle the error. 
} 
相關問題