我需要做从我的核心数据存储两个表/车型“加盟”型操作,而且我有困难的时候找到很好的例子了那里得到的东西喜欢这个工作。核心数据 - 简单连接型取
这是相当简单的什么,我需要做的。我有两个模型/表:location和location_categories,其中位置包含位置/建筑的详细信息(以及唯一的ID),location_categories表包含category_id和关联的location_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 /核心数据面来完成:
- (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?
预先感谢您可以在此提供任何方向!
将此标记为最佳答案,因为您提到需要连接关系。即使在模型中实现了关系之后,这仍然让我犹豫不决。谢谢! – svguerin3