Ios NSpredicate“'NSInvalidArgumentException',原因:'keypath SELF.SIZE未在实体中找到'
我有一个无法解决的问题,所以我希望能得到一些帮助: 我有一个包含文件系统元数据的dore数据数据库。我想检索大于10 KB的文件数,所以我使用谓词语句。不幸的是,该应用程序因以下原因崩溃: “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 =
// 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实际上是一个保留字。请参阅中的保留字列表,除此之外,您应该准备好了。