我有一个问题,我无法弄清楚所以我希望得到一些帮助:)
我有一个带有文件系统元数据的dore数据db。我想检索文件数> 10千字节,所以我使用谓词。不幸的是,应用程序崩溃了:
'NSInvalidArgumentException',原因:'在实体中找不到'keypath SELF.SIZE'
这里是代码:
// Initialize NSFetchrequest and define entity
NSError *error;
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *file = [NSEntityDescription entityForName:@"Files" inManagedObjectContext:appDelegate.managedObjectContext];
[request setEntity:file];
// Query on Number of files between 0 and 10000 bytes
NSNumber * tenk = @10000;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"any self.size < %@", tenk];
[request setPredicate:predicate];
fetchResult = [appDelegate.managedObjectContext executeFetchRequest:request error:&error];
int primaBar = fetchResult.count;
NSLog(@"Files smaller than 10k: %d :",primaBar);
代码可以工作,如果不是比较NSnumbers我比较字符串(例如,我能够检索扩展名为“pdf”的文件数与谓词@“任何self.extension包含%@”,扩展名)所以我相信我在访问NSnumber self.size时做错了。
提前感谢任何提示。
DOM
答案 0 :(得分:4)
解决了谜。
- 来自文档:
...一直到底部你可以阅读:
/ *
保留字
保留以下字样:
AND,OR,IN,NOT,ALL,ANY,SOME,NONE,LIKE,CASEINSENSITIVE,CI,MATCHES,CONTAINS,BEGINSWITH,ENDSWITH,BETWEEN,NULL,NIL,SELF,TRUE,YES,FALSE,NO,FIRST ,LAST,SIZE,ANYKEY,SUBQUERY,CAST,TRUEPREDICATE,FALSEPREDICATE
。 * /
您可以看到该大小是保留的工作,这确实会干扰谓词的执行。
最后以“像这样的方式逃避它:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"any self.'size' < %@" , tenk];
让我的查询工作。
我是IOS编程的新手,但这是一个棘手的问题(学会用最难的方式编写代码......)。
感谢您的头脑风暴!
DOM
答案 1 :(得分:2)
实际上这是语法。
[NSPredicate predicateWithFormat:@"%K < %@",
attributeName, attributeValue];
所以你可以试试这个。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K < %@",@"\size" ,tenk];
我认为,此处size
是属性名称。
<强>更新强>
参见Identifiers概念。我已相应更新了我的答案。
答案 2 :(得分:1)
SELF指的是当前使用的对象。
使用此
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"size < %@", tenk];
注意:仅当存在名为size的数据库属性存储每个文件的大小时,此方法才有效。
答案 3 :(得分:0)
尝试NSPredicate *predicate = [NSPredicate predicateWithFormat:@"size < %@", tenk];