无法将 NSNumber 存储在核心数据中

Posted

技术标签:

【中文标题】无法将 NSNumber 存储在核心数据中【英文标题】:Unable to store NSNumber in core data 【发布时间】:2011-01-04 12:50:17 【问题描述】:

我在我的应用程序中使用 Core Data。我有一个名为 PINCode 的属性,它具有属性 Int64。 现在,在我的应用程序中,我从文本字段中获取 PIN 码,将其转换为 NSNumber 并尝试存储为实体的属性值。但我无法这样做。例外情况控制台上显示的是:- 由于未捕获的异常 'NSInvalidArgumentException' 导致应用程序终止,原因:'不可接受的属性值类型:property = "PINCode";所需类型 = NSNumber;给定类型 = NSCFString;值 = 121。'

这里是代码:- (转换为 NSNumber):-

NSString *str= txtPINCode.text;
NSNumber *num = [[NSNumber alloc]init];
int tempNum = [str intValue];
num = [NSNumber numberWithInt:tempNum];

(存储在核心数据实体中):-

NSManagedObjectContext *context = [appDelegate managedObjectContext];
NSManagedObject *newContact;
newContact = [NSEntityDescription insertNewObjectForEntityForName:@"MemberTable" inManagedObjectContext:context];
[newContact setValue:num forKey:@"PINCode"];

此时应用程序崩溃。我无法找到崩溃的原因。我也尝试通过以下代码检查转换:-

NSNumber *testNumber = [[NSNumber alloc]init];
id test = num;
BOOL testMe = [test isKindOfClass:(Class)testNumber];

有人可以帮我吗? 提前致谢。

【问题讨论】:

您是否尝试将PINCode 的属性类型更改为Int 32?您不需要 PIN 码字段上的 64 位额外精度,并且 32 位 iPhone 处理器可能使用 Core Data 以不同方式表示 64 位类型。 您不能像在最后一行中那样将类实例类型转换为类。您需要为此使用[testNumber class]。无论如何,我不确定您要对类型比较做什么。 另外,你在上面的第二行代码中泄漏了一个 NSNumber 实例,因为你分配了一个数字,然后永远不会释放它并在两行之后覆盖它。 【参考方案1】:

嗯,第一个代码块有点奇怪。在第 2 行中,您分配了一个 NSNumber,然后在第 4 行中,您从第 2 行中泄漏了 NSNumber,并获得了一个新的 NSNumber 对象(自动释放)。

那么,当您谈到第二个代码块时,这些代码块是如何相关的? num(来自代码块 1)可能指向代码块 2 中的垃圾。

尝试删除代码块 1 的第 2 行,并在旧的第 4 行中写入以下内容:

NSNumber *num = [[NSNumber alloc] initWithInt:tempNum];

别忘了稍后发布。

【讨论】:

以上是关于无法将 NSNumber 存储在核心数据中的主要内容,如果未能解决你的问题,请参考以下文章

从 CoreData 实体中的 NSNumber 获取 intValue 时无法识别的选择器崩溃

将 NSDate 和 NSNumber 和/或保存在相同的核心数据属性中

NSNumber类和NSString类

64 位架构和核心数据中的 NSNumber

将核心数据中的 NSNumber 转换为 NSString

将 NSNumber 的 NSSet 更改为 int 的 NSSet