Я работаю над простым сравнением двух списков, чтобы увидеть, какие элементы в «оценочном» списке содержатся в большем «целевом» списке.Я получаю данные на лету, анализируя два 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 {
}