当前位置:  开发笔记 > 数据库 > 正文

iPhone上的CoreData是否支持IN谓词?

如何解决《iPhone上的CoreData是否支持IN谓词?》经验,为你挑选了1个好方法。

我正在尝试根据用户定义的类型列表获取一堆特定类型的记录...

[fetchRequest setEntity:[NSEntityDescription entityForName:@"myRecord" inManagedObjectContext:self.managedObjectContext]];  
NSSet   *shipTypes = [NSSet setWithObjects:[NSNumber numberWithInt:70],
                    [NSNumber numberWithInt:71],
                    [NSNumber numberWithInt:72],
                    [NSNumber numberWithInt:73],
                    [NSNumber numberWithInt:74],
                     nil];
NSPredicate *aPredicate = [NSPredicate predicateWithFormat:@"type in %@", shipTypes];
[fetchRequest setPredicate:aPredicate];
theRecords = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];

...运行时,executeFetchRequest消息抛出异常......

 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'unimplemented SQL generation for predicate : (type IN {71, 73, 70, 72, 74})'

我做错了什么,或者这真的不受支持?



1> Wil Shipley..:

我相信Alex是正确的,你必须使用NSArray,虽然显然它更好,如果在这里接受NSSet,因为顺序并不重要(尽管它可能会影响SQL的运行速度).

作为旁注,我从不在任何代码中使用+ predicateWithFormat:调用,因为它无法进行编译时的健全性或类型检查.我强烈建议使用个别课程.

在这种情况下,我会这样做:

fetchRequest.entity = [NSEntityDescription entityForName:@"myRecord" inManagedObjectContext:self.managedObjectContext]];

NSArray *shipTypes = [NSArray arrayWithObjects:[NSNumber numberWithInt:70],
                                        [NSNumber numberWithInt:71],
                                        [NSNumber numberWithInt:72],
                                        [NSNumber numberWithInt:73],
                                        [NSNumber numberWithInt:74],
                                         nil];
fetchRequest.predicate = [NSComparisonPredicate predicateWithLeftExpression:[NSExpression expressionForKeyPath:@"type"] rightExpression:[NSExpression expressionForConstantValue:shipTypes] modifier:NSDirectPredicateModifier type:NSInPredicateOperatorType options:0];

theRecords = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];

并不是说这会在编译时捕获到这个特定的错误,但它可能会在NSExpression级别捕获它,从而使错误更清楚.

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有