Core Dataストレージから2つのテーブル/モデルに対して「結合」タイプの操作を実行する必要があり、このようなものを機能させるための良い例を見つけるのに苦労しています。
私がしなければならないことはかなり簡単です。2つのモデル/テーブルがあります。locationsとlocation_categoriesです。ここで、locationsにはロケーション/施設の詳細が(一意のIDとともに)含まれ、location_categoriesテーブルにはcategory_idと関連付けられたlocation_idが含まれます。category_idを指定して、2つのテーブル/モデルを結合するすべての場所を選択する必要があります。ストレートSQLの場合、次のようになります(実際のSQLite DBに対して実行すると、このクエリは機能します)。
// pretend we passed in a catID of 29:
SELECT * FROM zlocation where zlocid in (select zlocid from zloccategory where zcatid = 29)
ご覧のとおり、これは非常に簡単です。2つのフェッチとforループを実行せずにこれを行う方法はありますか?これを行うための私の現在のObjective-cコードは以下のとおりであり、正常に機能しますが、両方のテーブルに大量のデータがあるため、もちろん、それはひどく遅く、非効率的です。forループは大幅な速度低下を引き起こしており、私の直感では、この作業は実際にはDB/Core-Data側で行う必要があると言っています。
- (NSMutableArray *) fetchLocsWithCatID:(NSString *)catID {
NSMutableArray *retArr = [[NSMutableArray alloc] init];
NSManagedObjectContext *context = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:MODELNAME_LOCCATEGORIES inManagedObjectContext:context]];
[fetchRequest setPredicate: [NSPredicate predicateWithFormat:@"catID == %@", catID]];
NSError *error;
NSArray *locCats = [context executeFetchRequest:fetchRequest error:&error];
NSArray *allLocsArr = [self fetchAllDataForTable:MODELNAME_LOCATION]; // this retrieves contents of entire table
for (Location *currLoc in allLocsArr) {
for (LocCategory *currLocCat in locCats) {
if ([currLoc.locID isEqualToString:currLocCat.locID]) {
if (![retArr containsObject:currLoc]) {
[retArr addObject:currLoc];
}
}
}
}
return retArr;
}
これが単一の述語/フェッチで可能かどうかについて何か考えはありますか?またはdunno..おそらくobjective-cコードを介してこれら2つのNSArrayを結合するより効率的な方法がありますか?
あなたがこれで提供できるどんな方向性にも前もって感謝します!