我正在对两个列表进行简单比较,以查看“评估”列表中的哪些项目包含在更大的“目标”列表中。我通过解析两个 CSV 文件并将所有内容存储为字符串来即时获取数据。我成功地将数据导入到数据存储中,并且可以毫无问题地获取实体列表
当我真正进行搜索时,问题就来了。本质上,我是在目标列表中的评估列表中寻找 1234
形式的短 ISBN,其形式为 1234-5
。我正在使用的谓词是我正在使用 [NSString stringWithFormat:@"%@ CONTAINS %@", kOC_Target_PrintBookCode, evalIsbn] 形式的
CONTAINS
比较
我得到的错误如下(由我的 NSLog
抓取)
NSInvalidArgumentException: Can't look for value (1494) in string (49885); value is not a string
我的印象是,即使 ISBN 是从 NSString 中读取的,并且 Core Data 存储将数据点指定为字符串,但无论出于何种原因,Core Data 仍在后台使用该值执行某些操作它认为合适。有什么想法吗?
这里是相关的流程逻辑(虽然我用这个词有点可疑)代码。除非代码中另有说明,否则所有被操作和/或存储的值都是 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 {
}
最佳答案
如果您将谓词构建为 NSString
,我相信
[NSString stringWithFormat:@"%@ CONTAINS %@", kOC_Target_PrintBookCode, isbnRoot]
实际上应该是
[NSString stringWithFormat:@"%@ CONTAINS '%@'", kOC_Target_PrintBookCode, isbnRoot]
您似乎混淆了 predicateWithFormat:
与 stringWithFormat:
的工作方式。
关于objective-c - 核心数据是否在后台进行自己的类型转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5625364/