Ios NSpredicate“'NSInvalidArgumentException',原因:'keypath SELF.SIZE未在实体中找到'

Ios NSpredicate“'NSInvalidArgumentException',原因:'keypath SELF.SIZE未在实体中找到',ios,objective-c,nspredicate,Ios,Objective C,Nspredicate,我有一个无法解决的问题,所以我希望能得到一些帮助: 我有一个包含文件系统元数据的dore数据数据库。我想检索大于10 KB的文件数,所以我使用谓词语句。不幸的是,该应用程序因以下原因崩溃: “NSInvalidArgumentException”,原因:“在实体中找不到keypath SELF.SIZE” 代码如下: // Initialize NSFetchrequest and define entity NSError *error; NSFetchRequest *request =

我有一个无法解决的问题,所以我希望能得到一些帮助:

我有一个包含文件系统元数据的dore数据数据库。我想检索大于10 KB的文件数,所以我使用谓词语句。不幸的是,该应用程序因以下原因崩溃:

“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);
如果我没有比较NSnumber,而是比较字符串,例如,我能够检索扩展名为pdf的文件数,并使用谓词@any self.extension contains%@,扩展名,因此我认为访问NSnumber self.size时我做错了

提前谢谢你的提示


dom

尝试NSPredicate*谓词=[NSPredicate谓词格式:@size<%@,tenk]

试试NSPredicate*谓词=[NSPredicate谓词格式:@size<%@,tenk]

实际上这是语法

[NSPredicate predicateWithFormat:@"%K < %@",
        attributeName, attributeValue];
所以你可以试试这个

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K < %@",@"\size" ,tenk];
我想,这里的大小是属性名

更新:


见概念。我已经相应地更新了我的答案

实际上这是语法

[NSPredicate predicateWithFormat:@"%K < %@",
        attributeName, attributeValue];
所以你可以试试这个

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K < %@",@"\size" ,tenk];
我想,这里的大小是属性名

更新:


见概念。我已经相应地更新了我的答案

SELF指正在使用的当前对象

用这个

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"size < %@", tenk];

注意:仅当名为size的数据库属性存储每个文件的大小时,此选项才起作用。

SELF指当前使用的对象

用这个

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"size < %@", tenk];
注意:仅当名为size的数据库属性存储每个文件的大小时,此选项才有效。

Mistery Solved

-从文件中:

…一直到底部,您可以阅读:

/*

保留字

保留以下文字:

和,或,IN,NOT,ALL,ANY,SOME,NONE,LIKE,不区分大小写,CI,MATCHES,CONTAINS,BEGINSWITH,ENDSWITH,BETWEEN,NULL,NIL,SELF,TRUE,YES,FALSE,NO,FIRST,LAST,SIZE,ANYKEY,SUBQUERY,CAST,TRUEPREDICATE,FALSE predicate

。 */

您可以看到大小是一个保留的工作,这确实会干扰谓词的执行

最后用“”对其进行转义,如下所示:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"any self.'size' < %@" , tenk];
使我的查询工作

我对IOS编程还不熟悉,但这是一个棘手的问题,学习如何以最难的方式编写代码

谢谢你的头脑风暴

dom

问题已解决

-从文件中:

…一直到底部,您可以阅读:

/*

保留字

保留以下文字:

和,或,IN,NOT,ALL,ANY,SOME,NONE,LIKE,不区分大小写,CI,MATCHES,CONTAINS,BEGINSWITH,ENDSWITH,BETWEEN,NULL,NIL,SELF,TRUE,YES,FALSE,NO,FIRST,LAST,SIZE,ANYKEY,SUBQUERY,CAST,TRUEPREDICATE,FALSE predicate

。 */

您可以看到大小是一个保留的工作,这确实会干扰谓词的执行

最后用“”对其进行转义,如下所示:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"any self.'size' < %@" , tenk];
使我的查询工作

我对IOS编程还不熟悉,但这是一个棘手的问题,学习如何以最难的方式编写代码

谢谢你的头脑风暴


dom

谢谢:它不将大小识别为属性。尝试了self.size和file.size['file'是实体名称],但仍然无法识别它,因此编译失败。@user3130919您的实体中是否有大小为的属性名称?是的,并且不知道大小是保留字,因此这里的崩溃%K是一个很好的解决方案,因为大小是谓词中的保留关键字。您所犯的唯一错误是应该是@size,而不是@size\size。甚至NSPredicate*谓词=[NSPredicate predicateWithFormat:@any self.size<%@,tenk];这是一个很好的解决方案,除了大小是一个保留字,所以我不得不避开它。我在阅读文档时发现了这一点。谢谢:它不将大小识别为属性。尝试了self.size和file.size['file'是实体名称],但仍然无法识别它,因此编译失败。@user3130919您的实体中是否有大小为的属性名称?是的,并且不知道大小是保留字,因此这里的崩溃%K是一个很好的解决方案,因为大小是谓词中的保留关键字。您所犯的唯一错误是应该是@size,而不是@size\size。甚至NSPredicate*谓词=[NSPredicate predicateWithFormat:@any self.size<%@,tenk];这是一个很好的解决方案,除了大小是一个保留字,所以我不得不避开它。我在阅读文档时发现了。谢谢。大小是实体文件的属性之一,因此我们在这方面做得很好。没有self,我有以下错误:*由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因是:“不支持的表达式类型11,大小”。这个问题与大小是一个NSnumber这一事实有关,因为任何其他具有字符串属性的查询都可以使用self正常工作。不确定NSnumber对谓词有什么影响,所以我
大小实际上是一个保留字。请参阅中的保留字列表,除此之外,您应该准备好了。谢谢。大小是实体文件的属性之一,因此我们在这方面做得很好。没有self,我有以下错误:*由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因是:“不支持的表达式类型11,大小”。这个问题与大小是一个NSnumber这一事实有关,因为任何其他具有字符串属性的查询都可以使用self正常工作。不确定NSnumber对谓词有什么影响,所以我有点卡住了。SIZE实际上是一个保留字。请参阅中的保留字列表,除此之外,您应该准备好了。