核心数据是不是在后台进行自己的类型转换?

Posted

技术标签:

【中文标题】核心数据是不是在后台进行自己的类型转换?【英文标题】:Does core data do its own type casting in the background?核心数据是否在后台进行自己的类型转换? 【发布时间】:2011-04-11 17:55:04 【问题描述】:

我正在对两个列表进行简单比较,以查看“评估”列表中的哪些项目包含在更大的“目标”列表中。我通过解析两个 CSV 文件并将所有内容存储为字符串来即时获取数据。我成功地将数据导入到数据存储中,我可以得到一个实体列表没有问题

当我实际进行搜索时,问题就来了。本质上,我正在从目标列表中的评估列表中寻找1234 形式的短ISBN,其形式为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 读取的,并且 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 

        

【问题讨论】:

【参考方案1】:

如果您将谓词构建为NSString,我相信

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

应该是

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

您似乎混淆了predicateWithFormat: 的工作方式和stringWithFormat: 的工作方式。

【讨论】:

成功了。而且,是的,我可能会混淆这两者。非常感谢您的帮助!【参考方案2】:

大概kOC_Target_PrintBookCodeisbnRoot 都不是可以转换为字符串的对象。例如。如果其中一个是整数,则%@ 运算符无法将整数转换为字符串值。

【讨论】:

kOC_Target_PrintBookCodeisbnRoot 都是明确的字符串。我首先用来填充商店的第一个。 isbnRoot 是字符串的子集。数据中没有任何数字,因此我很困惑。

以上是关于核心数据是不是在后台进行自己的类型转换?的主要内容,如果未能解决你的问题,请参考以下文章

在核心数据中进行大量迁移后尝试保存数据

[技术分享] 20171211_后端开发_使用@DateTimeFormat注解解决前台string类型与后台date类型的转换,使用@JsonFormat注解解决后台date类型与前台string类

C#编程(四十一)----------用户定义的数据类型转换

iPhone核心数据:可转换属性是不是必须仅转换为数据?

数据类型的转换

JavaScript中数据类型转换总结