objective-c - 核心数据是否在后台进行自己的类型转换?

标签 objective-c macos core-data

我正在对两个列表进行简单比较,以查看“评估”列表中的哪些项目包含在更大的“目标”列表中。我通过解析两个 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/

相关文章:

swift - 如何垂直对齐我的状态栏项目文本?

macos - Homebrew 软件更新错误 : Failure while executing: git pull -q origin refs/heads/master:refs/remotes/origin/master

linux - Boxcryptor 和 CloudFogger 等加密服务如何工作?

ios - 在 ios 中为 mapbox 创建自定义调用

objective-c - 按位算术和运算符

iOS UILabel 使用负背景色作为文本颜色

ios - Swift CoreData 模型有帮助吗? (给出的例子)

ios - 如何打开核心数据模型创建的sqlite文件以查看条目

ios - 快速从核心数据中获取会导致崩溃,因为我收到了其他类型的对象

objective-c - Cocos2d v2 + 花栗鼠 : Fails when adding shapes to a CCLayer