2013-05-28 8 views
7

が含まれている場合、私は私のアプリでは、以下のデータモデルを持っている:CoreDataチェック対多の関係は、オブジェクト

data model

基本的に私は、都市名としてaswell国名を保存したいです。各都市は1つの国に属し、1つの国には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

こんにちはMartinさん、この返信に感謝します。このソリューションは、私のコードを少し改良したようにしか見えません。 fetchrequestを作成し、 'countForFetchRequest:'を実行する方法はありませんか?「国はこの都市を含んでいません」または0を返します。メモリ使用量を減らすためにオブジェクトを作成するのは本当に好きではありません。 – pmk

+0

@pmk:そうです。私は答えを更新しました。 –

+0

私はちょうどあなたのコードをテストしました、それは今完全に動作します。私はあなたの回答コードを編集して他の人がそれを利用できるようにしました。ありがとうございました:) – pmk