У основных данных есть свое собственное приведение типов в фоновом режиме? - PullRequest
4 голосов
/ 11 апреля 2011

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

Проблема возникает, когда я действительно выполняю поиск.По сути, я ищу короткие ISBN в форме 1234 из списка оценки в целевом списке, которые имеют форму 1234-5.Я использую предикат: я использую сравнение CONTAINS в форме [NSString stringWithFormat:@"%@ CONTAINS %@", kOC_Target_PrintBookCode, evalIsbn]

Я получаю следующую ошибку (схваченную моим NSLog)

NSInvalidArgumentException: Can't look for value (1494) in string (49885); value is not a string

У меня складывается впечатление, что, хотя ISBN читается из NSString, а хранилище базовых данных имеет спецификацию точки данных в виде строки, эти базовые данные все еще работают в фоновом режиме со значением по какой-либо причинепоместиться.Любые идеи?


Вот соответствующая логика процесса (хотя я использую этот термин сомнительно) код.Если в коде не указано иное, все значения, которыми манипулируют и / или сохраняют, являются NSString:

NSArray *evalBooks = [self getEntitiesByName:kOC_EntityName_EvalBook 
                             usingPredicateValue:[NSString stringWithFormat:@"%@ > \"\"", kOC_Eval_Bookcode] 
                       withSubstitutionVariables:nil 
                                         inModel:[self managedObjectModel]
                                      andContext:[self managedObjectContext] 
                                 sortByAttribute:nil];

    if ( ( !evalBooks ) || ( [evalBooks count] == 0 ) ) {
        // we have problem
        NSLog(@"( !evalBooks ) || ( [evalBooks count] == 0 )");
        return;
    }

    [evalBooks retain];

    int firstEvalBook = 0;
    int thisEvalBook = firstEvalBook;
    int lastEvalBook = [evalBooks count]; NSLog(@"lastEvalBook: %i", lastEvalBook);
    for (thisEvalBook = firstEvalBook; thisEvalBook < lastEvalBook; thisEvalBook++) {

        NSManagedObject *evalBook = [[evalBooks objectAtIndex:thisEvalBook] retain];

        NSString *rawIsbn = [[evalBook valueForKey:kOC_Eval_Bookcode] retain];
        NSString *isbnRoot = [[self getIsbnRootFromIsbn:rawIsbn] retain];
        // this is a custom method I created and use elsewhere without any issues.
        NSArray *foundBooks = [self getEntitiesByName:kOC_EntityName_TargetBook 
                                   usingPredicateValue:[NSString stringWithFormat:@"%@ CONTAINS %@", kOC_Target_PrintBookCode, isbnRoot]
                             withSubstitutionVariables:nil 
                                               inModel:[self managedObjectModel] 
                                            andContext:[self managedObjectContext] 
                                       sortByAttribute:kOC_Target_PrintBookCode];

        if ( foundBooks != nil ) {

            [foundBooks retain];
            NSLog(@"foundBooks: %lu", [foundBooks count]);

        } else {

        }

Ответы [ 2 ]

3 голосов
/ 18 апреля 2011

Если вы строите свой предикат как NSString, я считаю,

[NSString stringWithFormat:@"%@ CONTAINS %@", kOC_Target_PrintBookCode, isbnRoot]

должно быть

[NSString stringWithFormat:@"%@ CONTAINS '%@'", kOC_Target_PrintBookCode, isbnRoot]

Кажется, вы путаете способ predicateWithFormat: работает так, как stringWithFormat: работает.

0 голосов
/ 12 апреля 2011

Предположительно, либо kOC_Target_PrintBookCode, либо isbnRoot не является объектом, который можно преобразовать в строку. Например. если любое из них является целым числом, оператор %@ не может преобразовать целое число в строковое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...