gpt4 book ai didi

iphone - 核心数据 - 简单的 JOIN 类型获取

转载 作者:可可西里 更新时间:2023-11-01 04:36:03 25 4
gpt4 key购买 nike

我需要对我的 Core Data 存储中的两个表/模型执行“连接”类型的操作,而且我很难找到好的示例来让这样的事情起作用。

我需要做的事情相当简单。我有两个模型/表:locations 和 location_categories,其中 locations 包含位置/机构的详细信息(以及唯一 ID),location_categories 表包含 category_id 和关联的 location_id。我需要选择所有位置,给定一个 category_id,它连接两个表/模型。如果它是直接的 SQL,它看起来像这样(当我针对实际的 SQLite 数据库运行这个查询时它确实有效):

// 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?

提前感谢您对此提供的任何指导!

最佳答案

最好的方法是使用关系。

这样,当您获取 Location 时,您还可以访问 LocationCategory,例如 myLocation.locationCategory

您需要像这样建立您的关系:

(Entity)LocationCategory.(relationship)locations <->> (Entity)Location.(relationship)locationCategory

这是一对多的关系。也不要忘记倒数。

设置完成后,您只需在创建实体实例的位置连接关系即可。喜欢:

 Location *myLocation = ...
LocationCategory *myLocationCategory = ...
myLocation.locationCategoy = myLocationCategory;

还要确保您使用相同的 MOC 来获取对象。我强烈推荐MagicalRecord轻松管理创建对象和获取指定的 moc。

关于iphone - 核心数据 - 简单的 JOIN 类型获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13753789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com