Сбой при использовании оператора предиката и числа с плавающей запятой - PullRequest
2 голосов
/ 24 февраля 2011

Так что я ищу в моих Базовых данных предмет, который находится внутри долготы и широты текущей карты. Каждый раз, когда я запускаю оператор, он вылетает.

код:

    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];

Как только я вызываю executeFetchRequest, он дает мне следующий отчет о сбое

2011-02-24 17: 42: 43.183 DL2 [363: 207] NE Долгота: 153.5058 2011-02-24 17: 42: 43.183 DL2 [363: 207] NE Широта: -27.811142 2011-02-24 17: 42: 43.183 DL2 [363: 207] SW Долгота: 153.286057 2011-02-24 17: 42: 43.184 DL2 [363: 207] Широта ЮЗ: -28.033804 2011-02-24 17: 42: 43.184 DL2 [363: 207] долгота МЕЖДУ {153.5058, 153.2861} И широтой МЕЖДУ {-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

Я просто не вижу проблемы. Я не знаю, слишком ли я близко к этому, или это как-то связано с тем, что это Float или что! Любая помощь будет принята с благодарностью

Ответы [ 4 ]

8 голосов
/ 24 февраля 2011

Ну, я не смог решить, почему функция Between не работала - но mysql также не позволяет BETWEEN для чисел с плавающей запятой.Так что я собираюсь предположить, что это аналогичная причина.

Я изменил свой код, чтобы просто создать свой собственный оператор между.

    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];
    }

Надеюсь, это поможет кому-то еще

1 голос
/ 21 июля 2013

У меня тоже была похожая ошибка.Я уверен, что это проблема, связанная с базой данных очень низкого уровня.Вот еще немного информации, которую я имею -

a.С базой данных памяти я мог бы выполнить контрольный пример с точно такими же данными.б.Когда я получил ошибку "- [__NSCFNumber constantValue]: нераспознанный селектор отправлен на экземпляр 0xa9e4ca0".Я сделал

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

Не уверен, откуда 178146464.Сейчас попробую мануал "между".

0 голосов
/ 24 февраля 2011

В начале вашей выборки вы объявляете

NSPredicate *predicateToRun = nil;

И затем вы назначаете ему NSCompoundPredicate в

predicateToRun = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:longPredicate, latPredicate, nil]];

Посмотрим, решит ли это это.Рог

0 голосов
/ 24 февраля 2011

Я не вижу точной причины, и вы не показали код, в котором установлены остальные свойства boutiqueRequest и запущена выборка (не то, чтобы это имело значение, если вы не установите предикат снова или что-то еще в стиле фанк) но отчет

2011-02-24 13: 57: 18.916 DL2 [9628: 207] - [NSCFNumber constantValue]: нераспознанный селектор, отправленный экземпляру 0x954ba80

указывает, что вы отправляете сообщение -constantValue объекту класса NSCFNumber (бесплатный экземпляр NSNumber / CFNumber), который его не обрабатывает. Поэтому я предлагаю вам попробовать использовать только части предиката, чтобы найти, что не вызывает и действительно вызывает замену некоторого выражения в предикате экземпляром NSCFNumber.

...