dma*_*man 0 core-data objective-c key-value-observing nspredicate ios
由于数据库结构有点复杂,我很难解决这个谓词问题.我有以下数据库结构,或者至少是这个问题的关注点:
PUBLISHER << --- >> PUBLICIST << - BOOK << ---> AUTHOR << - >> AGENTS
我尝试了以下谓词,当我过去遍历关系时,我已经使用过,但不是这个程度.我应该提一下,我有一个带有代理名称的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];
Run Code Online (Sandbox Code Playgroud)
当我运行上一个谓词时,我收到以下警告:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'unimplemented SQL generation for predicate : ANY pubHouse.publicist.assignedBook.authorRep.agentName IN
Run Code Online (Sandbox Code Playgroud)
我相信当我将Book Entity关系转移到Author Entity然后转移到Agent Entity时,谓词就会中断.在这一点上,建议会有所帮助.谢谢
您的问题是谓词解析器不知道ANY应该应用哪个集合.
使用此数据模型:
PUBLISHER<< --- >>PUBLICIST<<-->BOOK<<--->AUTHOR<<-->>AGENTS
Run Code Online (Sandbox Code Playgroud)
...你的关键路径:
pubHouse.publicist.assignedBook.authorRep.agentName
Run Code Online (Sandbox Code Playgroud)
...在对象和关系集方面看起来像:
object.set.object.object.set
Run Code Online (Sandbox Code Playgroud)
所以,这是ANY可以适用的两套.
您可以尝试构建一个子查询来处理谓词,但是如果你必须横跨那么多关系,那么你的fetch将涉及很大一部分数据并且非常非常慢(假设你首先让它工作.)
通常当你最终得到这样一个错综复杂的谓词时,它表明你正在从错误的一端接近问题.在这种情况下,从一个简单的谓词开始会更容易:
NSArray *agentNames = [NSArray arrayWithObjects:Dan, Hunter, Sloan, Jackson];
request.entity = [NSEntityDescription entityForName:@"Agent" inManagedObjectContext:context];
request.predicate = [NSPredicate predicateWithFormat:@"agentName IN %@", agentNames];
Run Code Online (Sandbox Code Playgroud)
然后你会走关系的关键路径:
authors.books.publicist.publishers
Run Code Online (Sandbox Code Playgroud)
...找到所有相关的出版商.
我认为无论你做什么都会遇到麻烦,因为我有多对多的关系,例如
PUBLISHER<<--->>PUBLICIST
Run Code Online (Sandbox Code Playgroud)
...以指数方式增加谓词和关系行走的复杂性.通常,在这种情况下,您可能需要一个额外的实体来更彻底地建模其中一个关系.这通常会降低数据模型本身的复杂性,从而简化了提取和行走.
| 归档时间: |
|
| 查看次数: |
1629 次 |
| 最近记录: |