NSFetchRequest与NSPredicate有时会抛出NSInvalidArgumentException

这一个是我莫名其妙:

我有我用下面的代码搜索/过滤器的核心数据集:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; [fetchRequest setEntity:[NSEntityDescription entityForName:@"Lead" inManagedObjectContext:moc]]; NSString *predicateString = [NSString stringWithFormat:@"(" "(isLocalVersion == %@) AND (LeadStatusID =='Active')" ") AND (" "(LeadID contains[cd] '%@')" "OR (AccountNumber contains[cd] '%@')" "OR (ANY contactItems.FirstName contains[cd] '%@')" "OR (ANY contactItems.LastName contains[cd] '%@')" "OR (ANY addressItems.Address1 contains[cd] '%@')" "OR (ANY addressItems.City contains[cd] '%@')" ")", [NSNumber numberWithBool:YES], sTerm, sTerm, sTerm, sTerm, sTerm, sTerm]; NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString]; [fetchRequest setPredicate:predicate]; NSError *error = nil; NSArray *leads = nil; @try { leads = [moc executeFetchRequest:fetchRequest error:&error]; } @catch (NSException *exception) { LogSevere(@"Error Executing Fetch Request: %@", exception); leads = [NSArray array]; } @finally { [fetchRequest release]; }

sTerm仅仅是一个NSString

这个工程的95%的时间,但是每一次抓到一个了一会儿NSInvalidArgumentException: Can't use in/contains operator with collection 10076173 (not a collection).

谓词的字符串格式是这样的:

((isLocalVersion == 1)和(LeadStatusID =='主动'))AND((LeadID包含[CD]'我')或(账户号码包含[CD]'我')或(ANY contactItems.FirstName包含[CD]的“i”)或(任何contactItems.LastName包含并[cd]'I')或(ANY addressItems.Address1包含并[cd]'I')或(ANY addressItems.City包含并[cd]'I'))

我的捕捉让我不会崩溃,只是返回0的结果,但这不是最佳的。 有没有人见过这个?

我唯一的线索是,它似乎发生后,我修改(并保存)在核心数据(仅一次有时)的记录。

--------------解决方案-------------

是的,你不能有评估,以集合为fetchRequest的谓语的一部分表现。 这是在文档中:

集合表达式不受核心数据的支持。

核心数据的SQL存储仅支持一个对多每查询操作;因此在发送到SQL存储任何谓词,有可能只有一个操作者(以及操作者的一个实例)从ALL,ANY和IN”。 https://developer.apple.com/library/mac/documentation/cocoa/Conceptual/Predicates/predicates.html

什么可能发生的是:

  • 如果早期的条件之一计算为TRUE ,其余条件不等价的,所以不会发生崩溃
  • 如果你到OR (ANY contactItems.FirstName contains[cd] '%@')它是TRUE ,你得到你第一次使用的ANY ,没有发生崩溃
  • 如果你到OR (ANY contactItems.LastName contains[cd] '%@')你会得到你的第二个使用ANY发生崩溃

您需要单独执行ANYs和组合的结果,可能使用NSCompoundPredicate;

LeadID任何机会,一个int属性? 我只是碰到了同样的问题,构建一个判断,我检查,看看如果一个或多个属性包含一个搜索词。 它的工作大部分时间 ,但时不时会失败,就像你的一个错误。

问题是,所有的我被检查的属性是字符串只有一个除外。 当我删除从谓词财产,一切运行良好。

我怀疑10076173是LeadID对数据库中的某些对象的int值。 看来,核心数据通常会整型转换为字符串,像你期望的那样,但有时它确实没有当错误发生那。 CONTAINS运算符不作上一个整数意识和崩溃。



作为进一步的证据,我试图改变谓词LIKE,而不是包含使用,我得到一个相关的错误,终于放倒我下发生了什么事。 谓词是

itemNumber LIKE“*测试*”或模式,如“*测试*”或产品描述,如“* *测试”[..snip ..]

而例外的是

“不能对对象1008正则表达式匹配”

在一点上,我意识到1008眼熟......像一个itemNumber,这是一个Int32。



至于核心数据的原因通常是,但并非总是如此,一个int属性,当您使用CONTAINS运算符转换为字符串,我不知道。 但我知道,谓词工作得很好,直到有上下文未保存的更改:特别是当一个对象的一对多关系性质发生了变化。

发现了类似的问题,这是检查NSDecimalNumber经度和它的一部分谓词来longitude<-23 ,造成的obj_c_exception_throw没有更多的细节。 此修复程序是确保有后一个空格< ,即longitude < -23 。 它基本上崩溃了与任何<-在一起,但没有>-

NSPredicate抛出一些奇怪的无证错误。

我似乎记得有与核心数据,集合在这里我取谓不知何故导致无效的SQL(其他数据存储类型工作得很好)类似的问题。 这不是一个理想的解决方案,但如果你有足够的几个对象,你可以做一个完整取出,然后过滤结果的事实后设置。

分类:目标C 时间:2015-03-15 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.947 (s). 10 q(s)