在核心数据中进行谓词搜索会导致第二次SIGABRT。 NSBetweenPredicateOperatorType [英] Predicate search in core data causes SIGABRT on second time through. NSBetweenPredicateOperatorType
问题描述
我在核心数据中看到了一个非常奇怪的行为。我正在搜索核心数据中的位置(数据存储类型为SQLite)。查询是在特定区域内查找位置对象。我正在将搜索作为之间谓词来实现。
I am seeing a really strange behavior in core data. I am doing a search for locations in core data (data store type is SQLite). The query is to look for location objects within a specific area. I am implementing the search as a between predicate.
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"]];
其中expressions数组是2个对象组成的数组,最小索引为0,最大索引为1。数组中的每个对象都是一个NSConstantValueExpression,定义为:
where expressions array is an array of 2 object, min in index 0, and max in index 1. Each object in the array is an NSConstantValueExpression, defined as :
NSExpression *ex = [NSExpression expressionForConstantValue : numberValue]
我在NSFetchedResultsController中使用谓词,尽管这完全符合我的预期,但还是第一次。最终的谓词是这样的:
I am using the predicate in a NSFetchedResultsController, and the first time though works exactly as I expect. The final predicate is something like this:
NSFetchRequest:0x7394360(实体:位置;谓词:(经度
BETWEEN {-122.0767937067412,
-121.7137663065599}和{37.16973380897733,
37.45968675392614}之间的纬度; sortDescriptors:(((name,ascending,compare :))));
limit:20;类型:
NSManagedObjectResultType;)
然后我得到了想要的结果。
And I get the results I want.
第二次运行此代码(将第二个视图推到顶部,然后关闭该视图。这将导致重新加载该视图)。系统崩溃,并显示此错误消息。
The second time this code is run (by pushing a second view on top, and closing that view. This causes the view to reload). The system crashes, with this error message.
-[NSConstantValueExpression比较:]:无法识别的选择器将
发送到实例0x71bbea0
2011-04-22 10:54:11.742 Wines [13667:207] 由于未捕获的异常
'NSInvalidArgumentException'终止了应用程序
,原因:
'-[NSConstantValueExpression
比较:]:无法识别的选择器将
发送到实例0x71bbea0' *
-[NSConstantValueExpression compare:]: unrecognized selector sent to instance 0x71bbea0 2011-04-22 10:54:11.742 Wines[13667:207] Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSConstantValueExpression compare:]: unrecognized selector sent to instance 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不支持聚合操作。您需要将其转换为:
BETWEEN
operations are aggregate operations, and aggregate operations are not supported by Core Data. You'll need to turn this into:
NSPredicate *p = [NSPredicate predicateWithFormat:@"%K >= %@ AND %K <= %@", keyPath, lowerBound, keyPath, upperBound];
这篇关于在核心数据中进行谓词搜索会导致第二次SIGABRT。 NSBetweenPredicateOperatorType的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!