Получение constantValue: нераспознанный селектор отправлен на ошибку экземпляра - PullRequest
3 голосов
/ 14 августа 2011

Получение этой ошибки с предикатом моей выборки

2011-08-13 13:49:12.405 Codes[16957:10d03] NSlog Array: code BETWEEN {"06", "07"} 
2011-08-13 13:49:12.407 Codes[16957:10d03] -[NSCFString constantValue]: unrecognized selector sent to instance 0x7464610 
2011-08-13 13:49:12.409 Codes[16957:10d03] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSCFString constantValue]: unrecognized selector sent to instance 0x7464610'

NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"ANY code BETWEEN %@", [NSArray arrayWithObjects:self.predicateFilterStart, self.predicateFilterEnd, nil]];:

NSLog показывает code BETWEEN {"06", "07"}

Класс модели для NSManagedObject со свойством code:

@interface MedicalCode : NSManagedObject

@property (nonatomic, retain) NSString * code;
@property (nonatomic, retain) NSString * codeDescription;
@property (nonatomic, retain) NSString * name;

Метод FRC: (ICD9Procedure является подклассом MedicalCode)

- (NSFetchedResultsController *)fetchedResultsController
{
    if (__fetchedResultsController != nil)
    {
        return __fetchedResultsController;
    }

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"ICD9Disease" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];

    NSPredicate *myPredicate = [NSPredicate predicateWithFormat:@"ANY code BEGINSWITH[c] %@", self.predicateFilter];
    [fetchRequest setPredicate:myPredicate];    

    [fetchRequest setFetchBatchSize:20];
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"code" ascending:YES];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

    [fetchRequest setSortDescriptors:sortDescriptors];

    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil];
    aFetchedResultsController.delegate = self;
    self.fetchedResultsController = aFetchedResultsController;

    [aFetchedResultsController release];
    [fetchRequest release];
    [sortDescriptor release];
    [sortDescriptors release];

    NSError *error = nil;
    if (![self.fetchedResultsController performFetch:&error])
    {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    return __fetchedResultsController;
} 

EDIT:

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

1 Ответ

3 голосов
/ 14 августа 2011

Попробуйте:

NSString *start = @"06";
NSString *end = @"07";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"ANY code BETWEEN %@",
                      [NSArray arrayWithObjects: start, end, nil]];
NSLog(@"%@", pred);

Это работает для меня:

2011-08-13 23:45:52.019 PredicateTest[18493:707] ANY code BETWEEN {"06", "07"}

, поэтому ошибка, вероятно, в свойствах.

FWIW, constantValue являетсяметод NSExpression.Не уверен, поможет ли это вам.


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

И вы говорите, что ошибка не появляется в коде, который вы первоначально опубликовали.Это происходит в другом фрагменте кода, который вы опубликовали сейчас, но мне не ясно, как это относится к исходному коду.

Обновление

По-видимому, из обсуждения в комментариях,оказывается, вам нужны числа, поэтому сделайте что-то вроде:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"ANY code BETWEEN %@",
                      [NSArray arrayWithObjects: 
                        [NSNumber numberWithDouble: 50.0],
                        [NSNumber numberWithDouble: 60.0],
                        nil]];

Окончательное решение

Для тех, кто заинтересован: очевидно, работает следующее.

NSPredicate *pred = [NSPredicate predicateWithFormat:@"ANY code BETWEEN %@",
                      [NSArray arrayWithObjects: 
                        [NSExpression expressionForConstantValue: [NSNumber numberWithDouble: 50.0]],
                        [NSExpression expressionForConstantValue: [NSNumber numberWithDouble: 60.0]],
                        nil]];
...