2013-05-28 6 views
7

शामिल मैं अपने ऐप में निम्न डेटा मॉडल है:CoreData की जांच करता है, तो करने के लिए कई-संबंध वस्तु

data model

मूल रूप से मैं शहर के नाम के रूप में अच्छी तरह से देश के नाम संग्रहीत करना चाहते हैं। प्रत्येक शहर एक देश से संबंधित है और एक देश में 0-एन शहर हैं।

इससे पहले कि मैं अब किसी निश्चित देश में नए शहरों को जोड़ूं, मुझे यह जानना होगा कि देश में पहले से ही इस नाम के साथ एक शहर है या नहीं।

अब तक मैं यह कर:

- (BOOL)countryForName:(NSString *)countryName containsCity:(NSString *)cityName { 
    Countries *country = [self countryForName:countryName]; 
    NSSet *cityNames = [country valueForKey:@"cities"]; 
    for (Cities *city in cityNames) { 
     if ([city.cityName isEqualToString:cityName]) { 
      return YES; 
     } 
    } 
    return NO; 
} 

यह स्पष्ट रूप से बहुत धीमी है, मैं क्या जरूरत है एक बराबर एक सही विधेय के साथ लाने के लिए है। मैं इस तरह एक इकाई के लिए खोज करें:

NSEntityDescription *entity  = [NSEntityDescription entityForName:@"Countries" inManagedObjectContext:self.managedObjectContext]; 
    [fetchRequest setEntity:entity]; 

    // Edit the sort key as appropriate. 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"countryName" ascending:YES]; 
    NSArray *sortDescriptors   = @[sortDescriptor]; 
    fetchRequest.sortDescriptors  = sortDescriptors; 

    // Edit the section name key path and cache name if appropriate. 
    // nil for section name key path means "no sections". 
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"GetCountryList"]; 
    aFetchedResultsController.delegate = self; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"countryName == %@", countryName]; 
    [aFetchedResultsController.fetchRequest setPredicate:predicate]; 

लेकिन मैं यह कैसे करते हो, तो एक खोज, विभिन्न इकाइयों में शामिल है? या दूसरे शब्दों में: मैं केवल एक देश के लिए अद्वितीय शहर के नाम कैसे जोड़ूं?
बहुत बहुत धन्यवाद!

उत्तर

11

आप की जाँच करने के लिए कि किसी भी देश वस्तु पहले से ही एक नाम के साथ एक शहर शामिल हैं चाहते हैं, आप

Countries *country = ... 
NSString *cityName = ... 
if ([[country valueForKeyPath:@"cities.name"] containsObject:cityName]) { 
    // ... 
} 

कर सकते हैं या, एक लाने का अनुरोध का उपयोग कर:

NSString *countryName = ... 
NSString *cityName = ... 
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Countries"]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"countryName == %@ AND ANY cities.cityName == %@", countryName, cityName]; 
[fetchRequest setPredicate:predicate]; 

NSError *error; 
NSUInteger count = [self.managedObjectContext countForFetchRequest:fetchRequest error:&error]; 

if (count == NSNotFound) { 
    // error 
} else if (count == 0) { 
    // no matching country 
} else { 
    // at least one matching country 
} 

ध्यान दें कि एक NSFetchedResultsController आमतौर पर तालिका दृश्य में फ़ेच अनुरोध की सामग्री प्रदर्शित करने के लिए उपयोग किया जाता है, इसलिए इसकी आवश्यकता नहीं है।

+0

हाय मार्टिन, इस उत्तर के लिए धन्यवाद। यह समाधान केवल मेरे कोड में बहुत कम सुधार की तरह दिखता है। क्या कोई fetchrequest बनाने का कोई तरीका नहीं है और फिर 'countForFetchRequest:' देश को "इस शहर में शामिल नहीं है" के लिए 0 लौटा रहा है या "देश में इस शहर में" के लिए मूल्य> 0 है? मैं स्मृति उपयोग को कम करने के लिए वास्तव में वस्तुओं को बनाना पसंद नहीं करता ... – pmk

+0

@pmk: आप सही हैं। मैंने जवाब अपडेट किया है। –

+0

मैंने अभी आपके कोड का परीक्षण किया है, यह अब पूरी तरह से काम करता है। मैंने आपके उत्तर कोड को संपादित किया ताकि अन्य इसका लाभ उठा सकें, बहुत बहुत धन्यवाद :) – pmk

संबंधित मुद्दे