核心数据是不是在后台进行自己的类型转换?
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_PrintBookCode
或isbnRoot
都不是可以转换为字符串的对象。例如。如果其中一个是整数,则%@
运算符无法将整数转换为字符串值。
【讨论】:
kOC_Target_PrintBookCode
和 isbnRoot
都是明确的字符串。我首先用来填充商店的第一个。 isbnRoot 是字符串的子集。数据中没有任何数字,因此我很困惑。以上是关于核心数据是不是在后台进行自己的类型转换?的主要内容,如果未能解决你的问题,请参考以下文章
[技术分享] 20171211_后端开发_使用@DateTimeFormat注解解决前台string类型与后台date类型的转换,使用@JsonFormat注解解决后台date类型与前台string类