2013-05-28 110 views
7

我在我的應用程序下面的數據模型:CoreData檢查一對多關係包含對象

data model

基本上我想藏漢存儲國名的城市名稱。每個城市屬於一個國家,一個國家包含0 - n個城市。

在我現在向某個國家添加新城市之前,我需要知道該國是否已經包含一個具有此名稱的城市。

直到現在我這樣做:

- (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