2011-04-22 34 views
1

我在核心数据中看到了一个非常奇怪的行为。我正在搜索核心数据中的位置(数据存储类型是SQLite)。查询是查找特定区域内的位置对象。我正在执行搜索,作为之间的谓词谓词。核心数据中的谓词搜索通过第二次导致SIGABRT。 NSBetweenPredicateOperatorType

NSExpression *ex = [NSExpression expressionForConstantValue : numberValue] 

我使用:

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和max在索引1中的阵列中的每个对象作为被一个NSConstantValueExpression,定义在NSFetchedResultsController中的谓词,并且第一次尽管完全按照我的预期工作。最后谓词是这样的:

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

而且我得到了我想要的结果。

第二次运行此代码(通过顶部的第二个视图并关闭该视图,这会导致视图重新加载)。系统崩溃,并显示此错误消息。

- [NSConstantValueExpression比较:]:无法识别的选择发送到 实例0x71bbea0 2011-04-22 10:54:11.742葡萄酒[13667:207] 终止应用程序 由于未捕获的异常 “NSInvalidArgumentException ”,原因: ' - [NSConstantValueExpression 比较:]:无法识别的选择发送 到实例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”. 
+0

做了一些更多的搜索,并且这个答案解决了这个问题。 不知道为什么它的作品第一次。但更改为和解决了我的问题。 戴夫,如果我知道如何相信你的答案,我会...... – Yenyi 2011-04-22 19:34:40

回答

3

这里亚去...

BETWEEN操作是聚合操作和集合操作不受核心数据的支持。你需要把它变成:

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