Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Crash when using Between Predicate Statement and Float

So i'm searching my Core Data for an item that is inside the current map's longitude and latitude. Everytime i run the statement it crashes.

the code:

    NSError *error = nil;
    NSFetchRequest *boutiqueRequest = [[NSFetchRequest alloc] init];
    NSPredicate *predicateToRun = nil;

    [boutiqueRequest setEntity:[NSEntityDescription entityForName:@"Boutique" inManagedObjectContext:managedObjectContext]];

NSLog(@"NE Longitude: %f", [neCoordLong floatValue]);
NSLog(@"NE Latitude: %f", [neCoordLat floatValue]);
    NSLog(@"SW Longitude: %f", [swCoordLong floatValue]);
    NSLog(@"SW Latitude: %f", [swCoordLat floatValue]);
    NSPredicate *longPredicate = [NSPredicate predicateWithFormat: @"longitude BETWEEN %@", [NSArray arrayWithObjects:neCoordLong, swCoordLong, nil]];
    NSPredicate *latPredicate = [NSPredicate predicateWithFormat: @"latitude BETWEEN %@", [NSArray arrayWithObjects:neCoordLat, swCoordLat, nil]];
    predicateToRun = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:longPredicate, latPredicate, nil]];

    [boutiqueRequest setPredicate:predicateToRun];
    NSLog(@"%@", [boutiqueRequest predicate]);
    NSArray *results = [managedObjectContext executeFetchRequest:boutiqueRequest error:&error];

As soon as I call the executeFetchRequest it gives me the following crash report

2011-02-24 17:42:43.183 DL2[363:207] NE Longitude: 153.5058 2011-02-24 17:42:43.183 DL2[363:207] NE Latitude: -27.811142 2011-02-24 17:42:43.183 DL2[363:207] SW Longitude: 153.286057 2011-02-24 17:42:43.184 DL2[363:207] SW Latitude: -28.033804 2011-02-24 17:42:43.184 DL2[363:207] longitude BETWEEN {153.5058, 153.2861} AND latitude BETWEEN {-27.81114, -28.0338}

2011-02-24 13:57:18.916 DL2[9628:207] -[NSCFNumber constantValue]: unrecognized selector sent to instance 0x954ba80
    2011-02-24 13:57:18.925 DL2[9628:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSCFNumber constantValue]: unrecognized selector sent to instance 0x954ba80'
    *** Call stack at first throw:
    (
        0   CoreFoundation                      0x0121abe9 __exceptionPreprocess + 185
        1   libobjc.A.dylib                     0x0136f5c2 objc_exception_throw + 47
        2   CoreFoundation                      0x0121c6fb -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
        3   CoreFoundation                      0x0118c366 ___forwarding___ + 966
        4   CoreFoundation                      0x0118bf22 _CF_forwarding_prep_0 + 50
        5   CoreData                            0x00e18a0b -[NSSQLSimpleWhereIntermediate _generateSQLBetweenStringInContext:] + 1211
        6   CoreData                            0x00d48931 -[NSSQLSimpleWhereIntermediate generateSQLStringInContext:] + 897
        7   CoreData                            0x00d4843d -[NSSQLCompoundWhereIntermediate _generateMulticlauseStringInContext:] + 205
        8   CoreData                            0x00d48342 -[NSSQLCompoundWhereIntermediate generateSQLStringInContext:] + 770
        9   CoreData                            0x00d47afa -[NSSQLFetchIntermediate generateSQLStringInContext:] + 122
        10  CoreData                            0x00e0b31d -[NSSQLGenerator newSQLStatementForFetchRequest:ignoreInheritance:countOnly:nestingLevel:] + 413
        11  CoreData                            0x00d43a78 -[NSSQLAdapter _newSelectStatementWithFetchRequest:ignoreInheritance:] + 488
        12  CoreData                            0x00d43881 -[NSSQLAdapter newSelectStatementWithFetchRequest:] + 49
        13  CoreData                            0x00d4372e -[NSSQLCore newRowsForFetchPlan:] + 430
        14  CoreData                            0x00d42ab5 -[NSSQLCore objectsForFetchRequest:inContext:] + 357
        15  CoreData                            0x00d4266e -[NSSQLCore executeRequest:withContext:error:] + 206
        16  CoreData                            0x00df20ec -[NSPersistentStoreCoordinator executeRequest:withContext:error:] + 1084
        17  CoreData                            0x00d3f807 -[NSManagedObjectContext executeFetchRequest:error:] + 359
        18  DL2                                 0x00021060 -[BoutiqueListViewController getBoutiquesToShow] + 1449
        19  DL2                                 0x0002164f -[BoutiqueListViewController viewDidLoad] + 211
        20  UIKit                               0x003f265e -[UIViewController view] + 179
        21  DL2                                 0x0001ff4e -[BoutiqueMapTabViewController openList] + 698
        22  DL2                                 0x0001f9f3 -[BoutiqueMapTabViewController tabBar:didSelectItem:] + 110
        23  UIKit                               0x00542167 -[UITabBar _sendAction:withEvent:] + 283
        24  UIKit                               0x00344a6e -[UIApplication sendAction:to:from:forEvent:] + 119
        25  UIKit                               0x003d31b5 -[UIControl sendAction:to:forEvent:] + 67
        26  UIKit                               0x003d5647 -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 527
        27  UIKit                               0x003d316c -[UIControl sendActionsForControlEvents:] + 49
        28  UIKit                               0x00344a6e -[UIApplication sendAction:to:from:forEvent:] + 119
        29  UIKit                               0x003d31b5 -[UIControl sendAction:to:forEvent:] + 67
        30  UIKit                               0x003d5647 -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 527
        31  UIKit                               0x003d41f4 -[UIControl touchesEnded:withEvent:] + 458
        32  UIKit                               0x003690d1 -[UIWindow _sendTouchesForEvent:] + 567
        33  UIKit                               0x0034a37a -[UIApplication sendEvent:] + 447
        34  UIKit                               0x0034f732 _UIApplicationHandleEvent + 7576
        35  GraphicsServices                    0x01b3da36 PurpleEventCallback + 1550
        36  CoreFoundation                      0x011fc064 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
        37  CoreFoundation                      0x0115c6f7 __CFRunLoopDoSource1 + 215
        38  CoreFoundation                      0x01159983 __CFRunLoopRun + 979
        39  CoreFoundation                      0x01159240 CFRunLoopRunSpecific + 208
        40  CoreFoundation                      0x01159161 CFRunLoopRunInMode + 97
        41  GraphicsServices                    0x01b3c268 GSEventRunModal + 217
        42  GraphicsServices                    0x01b3c32d GSEventRun + 115
        43  UIKit                               0x0035342e UIApplicationMain + 1160
        44  DL2                                 0x000028fc main + 102
        45  DL2                                 0x0000288d start + 53

I just can't seem to see the problem. I don't know if i'm too close to it, or if it's something to do with it being a Float or what! Any help would be greatly appreciated

like image 296
Brett Avatar asked Apr 27 '26 17:04

Brett


2 Answers

Well i wasn't able to solve why the Between function didn't work - but mysql doesn't allow BETWEEN on floating point numbers either. So i'm going to assume that it's a similar reason.

I changed my code to merely create it's own between statement.

    NSPredicate *longPredicate = nil;
    NSPredicate *latPredicate = nil;
    if ([neCoordLong floatValue] > [swCoordLong floatValue])
    {
        longPredicate = [NSPredicate predicateWithFormat: @" longitude <= %@ AND longitude >= %@", neCoordLong, swCoordLong];
    }else {
        longPredicate = [NSPredicate predicateWithFormat: @" longitude <= %@ AND longitude >= %@", swCoordLong, neCoordLong];
    }
    if ([neCoordLat floatValue] > [swCoordLat floatValue])
    {
        latPredicate = [NSPredicate predicateWithFormat: @" latitude <= %@ AND latitude >= %@", neCoordLat, swCoordLat];
    }else {
        latPredicate = [NSPredicate predicateWithFormat: @" latitude <= %@ AND latitude >= %@", swCoordLat, neCoordLat];
    }

Hopefully this helps someone else

like image 120
Brett Avatar answered Apr 29 '26 15:04

Brett


I had a similar error as well. I am pretty sure it is a very low level database related issue. Here is some more information I have -

a. With a inmemory database, I could run a test case with exactly the same data just fine. b. When I got the error "-[__NSCFNumber constantValue]: unrecognized selector sent to instance 0xa9e4ca0". I did

(lldb) po 0xa9e4ca0
 $0 = 178146464 -96.24999189101783

Not sure where 178146464 coming from. I will try the manual "between" now.

like image 29
BSharer App - Share Books Avatar answered Apr 29 '26 13:04

BSharer App - Share Books



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!