核心数据中的谓词搜索会导致第二次SIGABRT。 NSBetweenPredicateOperatorType

我在核心数据中看到了一个非常奇怪的行为。 我正在搜索核心数据中的位置(数据存储类型是SQLite)。 查询是查找特定区域内的位置对象。 我正在将搜索实现为谓词之间

NSExpression *lhs = [NSExpression expressionForKeyPath:keyPath]; NSExpression *rhs = [NSExpression expressionForVariable:@"MIN_MAX"]; NSPredicate *predicateTemplate = [NSComparisonPredicate predicateWithLeftExpression:lhs rightExpression:rhs modifier:NSDirectPredicateModifier type:NSBetweenPredicateOperatorType options:0]; NSPredicate *predicate = [predicateTemplate predicateWithSubstitutionVariables: [NSDictionary dictionaryWithObject:expressionArray forKey:@"MIN_MAX"]]; 

其中表达式数组是2个对象的数组,索引为0的min,索引1中的max。数组中的每个对象都是NSConstantValueExpression,定义如下:

 NSExpression *ex = [NSExpression expressionForConstantValue : numberValue] 

我在NSFetchedResultsController中使用谓词,并且第一次完全按照我的预期工作。 最终的谓词是这样的:

NSFetchRequest:0x7394360(实体:位置;谓词:(经度BETWEEN {-122.0767937067412,-121.7137663065599}和纬度BETWEEN {37.16973380897733,37.45968675392614}); sortDescriptors:((“(名称,升序,比较:)”));限制:20 ;类型:NSManagedObjectResultType;)

我得到了我想要的结果。

第二次运行此代码(通过在顶部推送第二个视图,然后关闭该视图。这会导致视图重新加载)。 系统崩溃,出现此错误消息。

– [NSConstantValueExpression compare:]:无法识别的选择器发送到实例0x71bbea0 2011-04-22 10:54:11.742葡萄酒[13667:207]由于未捕获的exception’NSInvalidArgumentException’终止应用程序,原因:’ – [NSConstantValueExpression compare:]:无法识别选择器发送到实例0x71bbea0’*

有什么建议么?

全栈如下。

谢谢,

  *** Call stack at first throw: ( 0 CoreFoundation 0x02f0bb99 __exceptionPreprocess + 185 1 libobjc.A.dylib 0x0305b40e objc_exception_throw + 47 2 CoreFoundation 0x02f0d6ab -[NSObject(NSObject) doesNotRecognizeSelector:] + 187 3 CoreFoundation 0x02e7d2b6 ___forwarding___ + 966 4 CoreFoundation 0x02e7ce72 _CF_forwarding_prep_0 + 50 5 Foundation 0x002dd909 -[NSBetweenPredicateOperator performPrimitiveOperationUsingObject:andObject:] + 317 6 Foundation 0x0020aee4 -[NSComparisonPredicate evaluateWithObject:substitutionVariables:] + 306 7 Foundation 0x00210ead -[NSCompoundPredicateOperator evaluatePredicates:withObject:substitutionVariables:] + 292 8 Foundation 0x00210d57 -[NSCompoundPredicate evaluateWithObject:substitutionVariables:] + 254 9 Foundation 0x0020adac -[NSPredicate evaluateWithObject:] + 49 10 CoreData 0x0252ae08 -[NSManagedObjectContext executeFetchRequest:error:] + 1752 11 Wines 0x00021b27 -[MOListViewController listFRC] + 1034 12 Wines 0x000bb1e8 -[MOLocationSelectableListViewController numberOfSectionsInTableView:] + 36 13 UIKit 0x0061849c -[UITableViewRowData(UITableViewRowDataPrivate) _updateNumSections] + 111 14 UIKit 0x00618228 -[UITableViewRowData invalidateAllSections] + 66 15 UIKit 0x004d2880 -[UITableView(_UITableViewPrivate) _updateRowData] + 113 16 UIKit 0x004cbe9c -[UITableView noteNumberOfRowsChanged] + 105 17 UIKit 0x004d853c -[UITableView reloadData] + 773 18 UIKit 0x004d5724 -[UITableView layoutSubviews] + 42 19 QuartzCore 0x02a22481 -[CALayer layoutSublayers] + 177 20 QuartzCore 0x02a221b1 CALayerLayoutIfNeeded + 220 21 QuartzCore 0x02a220bd -[CALayer layoutIfNeeded] + 111 22 UIKit 0x0050c94b -[UIViewController window:willAnimateRotationToInterfaceOrientation:duration:] + 567 23 UIKit 0x004889bd -[UIWindow _setRotatableClient:toOrientation:duration:force:] + 4159 24 UIKit 0x006fa67b -[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:] + 768 25 UIKit 0x0050f10d -[UIViewController presentModalViewController:withTransition:] + 2937 26 UIKit 0x00508402 -[UIViewController _tryRecursivelyPresentModalViewController:withTransition:] + 134 27 UIKit 0x005083c6 -[UIViewController _tryRecursivelyPresentModalViewController:withTransition:] + 74 28 UIKit 0x0050e8e6 -[UIViewController presentModalViewController:withTransition:] + 850 29 Wines 0x0002d7a9 -[MOViewController didSelectToOneSelectOneAtIndexPath:] + 2195 30 Wines 0x0002e843 -[MOViewController tableView:didSelectRowAtIndexPath:] + 4219 31 Wines 0x0005544f -[MOPriceViewController tableView:didSelectRowAtIndexPath:] + 1509 32 UIKit 0x004d4a48 -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 1140 33 UIKit 0x004cb32e -[UITableView _userSelectRowAtIndexPath:] + 219 34 Foundation 0x001e021a __NSFireDelayedPerform + 441 35 CoreFoundation 0x02eecf73 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 19 36 CoreFoundation 0x02eee5b4 __CFRunLoopDoTimer + 1364 37 CoreFoundation 0x02e4add9 __CFRunLoopRun + 1817 38 CoreFoundation 0x02e4a350 CFRunLoopRunSpecific + 208 39 CoreFoundation 0x02e4a271 CFRunLoopRunInMode + 97 40 GraphicsServices 0x035bf00c GSEventRunModal + 217 41 GraphicsServices 0x035bf0d1 GSEventRun + 115 42 UIKit 0x0046faf2 UIApplicationMain + 1160 43 Wines 0x00002814 main + 102 44 Wines 0x000027a5 start + 53 ) terminate called after throwing an instance of 'NSException' Program received signal: “SIGABRT”. 

在这里…

BETWEEN操作是聚合操作,Core Data不支持聚合操作。 你需要把它变成:

 NSPredicate *p = [NSPredicate predicateWithFormat:@"%K >= %@ AND %K <= %@", keyPath, lowerBound, keyPath, upperBound];