NSpredicate“'NSInvalidArgumentException',原因:'在实体中找不到keypath SELF.SIZE <nssqlentity files =”“id =”1“>'”</nssqlentity>

时间:2014-01-25 04:50:07

标签: ios objective-c nspredicate

我有一个问题,我无法弄清楚所以我希望得到一些帮助:)

我有一个带有文件系统元数据的dore数据db。我想检索文件数&gt; 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

4 个答案:

答案 0 :(得分:4)

解决了谜。

- 来自文档:

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Predicates/Articles/pSyntax.html

...一直到底部你可以阅读:

/ *

保留字

保留以下字样:

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];