我需要对我的核心数据存储中的两个表/模型进行“加入”类型的操作,而且我很难找到好的例子来让这样的事情发挥作用。
我需要做的事情相当简单。我有两个模型/表:位置和 location_categories,其中位置包含位置/机构的详细信息(以及唯一 ID),并且 location_categories 表包含具有关联 location_id 的 category_id。我需要选择给定 category_id 连接两个表/模型的所有位置。如果它是直接的 SQL,它看起来像这样(当我对实际的 SQLite DB 运行它时,这个查询确实有效):
// pretend we passed in a catID of 29:
SELECT * FROM zlocation where zlocid in (select zlocid from zloccategory where zcatid = 29)
如您所见,它非常简单。有没有办法做到这一点而不必进行两次提取和 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;
}
关于这是否可以通过一个谓词/提取来实现的任何想法?或者不知道......也许有一种更有效的方法可以通过objective-c代码加入这两个NSArrays?
提前感谢您对此提供的任何指导!