gpt4 book ai didi

objective-c - 复杂的 NSPredicate 遍历多个实体和关系类型

转载 作者:行者123 更新时间:2023-11-28 18:44:02 26 4
gpt4 key购买 nike

我很难解决这个谓词问题,因为数据库结构有点复杂。我有以下数据库结构,或者至少是这个问题的关注点:

出版商<< --->>出版商<<--书籍<<--->作者<<-->>代理

我尝试了以下我在过去遍历关系时使用过的谓词,但没有达到这种程度。我应该提到我有一个 NSArray,其中包含代理名称,我想查询数据库以确定与该代理合作的出版社列表:

NSArray *agentNames = [NSArray arrayWithObjects:Dan, Hunter, Sloan, Jackson];

NSFetchRequest *request = [[NSFetchRequest alloc] init];

request.entity = [NSEntityDescription entityForName:@"Publisher" inManagedObjectContext:context];
request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor
sortDescriptorWithKey:@"publisherName" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)] ];
request.predicate = [NSPredicate predicateWithFormat:@"ANY pubHouse.publicist.assignedBook.authorRep.agentName IN %@", [agentNames valueForKey:@"agentName"]];
request.fetchBatchSize = 20;

NSFetchedResultsController *frc = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];

当我运行前面的谓词时,我收到以下警告:

 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'unimplemented SQL generation for predicate : ANY pubHouse.publicist.assignedBook.authorRep.agentName IN

我相信当我将图书实体关系移动到作者实体,然后移动到代理实体时,谓词就会中断。在这一点上,建议会有所帮助。谢谢

最佳答案

您的问题是谓词解析器不知道应该将 ANY 应用于什么集合。

使用此数据模型:

PUBLISHER<< --- >>PUBLICIST<<-->BOOK<<--->AUTHOR<<-->>AGENTS

……你的键路径:

pubHouse.publicist.assignedBook.authorRep.agentName

…在对象和关系集方面看起来像:

object.set.object.object.set

因此,这是 ANY 可以应用的两个集合。

您可以尝试构建一个子查询来处理谓词,但如果您必须跨越那么多关系,您的提取将涉及大量数据并且会非常非常慢(假设您在第一个位置。)

通常,当您以这样一个令人费解的谓词结束时,表明您正在从错误的一端着手解决问题。在这种情况下,从一个简单的谓词开始会更容易:

NSArray *agentNames = [NSArray arrayWithObjects:Dan, Hunter, Sloan, Jackson];
request.entity = [NSEntityDescription entityForName:@"Agent" inManagedObjectContext:context];
request.predicate = [NSPredicate predicateWithFormat:@"agentName IN %@", agentNames];

然后您将走以下的关系关键路径:

authors.books.publicist.publishers 

… 找到所有相关的发布者。

我认为无论你做什么你都会遇到麻烦,因为有不止一个对多对多的关系,例如

PUBLISHER<<--->>PUBLICIST

… 以指数方式增加谓词和关系遍历的复杂性。通常,在这种情况下,您可能需要一个额外的实体来更彻底地建模其中一种关系。这通常会降低数据模型本身的复杂性,从而简化获取和遍历。

关于objective-c - 复杂的 NSPredicate 遍历多个实体和关系类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7153101/

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