2011-10-08 20 views
5

मैं एनएसपी्रेडिकेट से एक अलग परिणाम प्राप्त करने की कोशिश कर रहा हूं।विशिष्ट गुणों के साथ 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]; 

मुद्दा यह है कि परिणाम कई बार एक ही शहर रिटर्न है। इस संस्था में बहुत से सदस्य हैं, और प्रत्येक सदस्य की संपत्ति "शहर" है।

मैं क्या गलत कर रहा हूं?

धन्यवाद,

आर एल

उत्तर

7

NSFetchRequestNSDictionaryResultType के resultType स्थापित करने के लिए सुनिश्चित करें। डिफ़ॉल्ट वस्तुओं को वापस करना डिफ़ॉल्ट है, और इसलिए यह propertiesToFetch को अनदेखा कर देगा।

+0

मैं शायद जोड़ना चाहिए कि 'NSFetchedResultsController' आम तौर पर' NSDictionaryResultType' के एक प्रशंसक नहीं है। आप अन्य समस्याओं में भाग ले सकते हैं और 'NSFetchedResultsController' को त्यागना होगा। – Alex

+0

सवाल यह है कि मैं परिणाम और NSDictionary नहीं चाहता हूं। यदि नहीं, तो मुझे अपना कुछ कोड बदलना होगा। क्या यह अन्य तरीके से करने योग्य है? –

+0

आप किस वस्तु को वापस लौटने की उम्मीद कर रहे हैं, फिर? कोर डेटा केवल उन वस्तुओं को वापस कर सकता है जो वास्तव में आपके ऑब्जेक्ट ग्राफ़ में मौजूद हैं। – Alex

6

@Alex की मदद से, यहाँ अंतिम कोड है, एफआरसी के बिना:

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

आप इसे और अधिक आसानी से कर सकते हैं। बस यह करें: 'एनएसएआरएआरए * शहरों = [tempArray valueForKeyPath: @" city "]; 'यह सरणी में प्रत्येक शब्दकोश के लिए' शहर' का मान प्राप्त करेगा और उन्हें एक सरणी में रखेगा। – Alex

+1

@ एलेक्स, अगर ऐरे में कोई शून्य मूल्य नहीं है तो यह ठीक काम करता है। यदि कोई शून्य मूल्य है, तो यह दुर्घटनाग्रस्त हो जाता है। –

+0

ओह। मैंने इस मुद्दे की जांच करते हुए रुई की "दुर्घटना" टिप्पणी को उखाड़ फेंक दिया, इसे एक मूल्यवान सावधानी बरतने लगा। लेकिन एनएसएआरएआरई रेफ रेफरी थोड़ा अलग तरीका सूचीबद्ध करता है, "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. 
} 
संबंधित मुद्दे