xcode核心数据类中的数据类型不匹配

Posted

技术标签:

【中文标题】xcode核心数据类中的数据类型不匹配【英文标题】:Data type mismatch in xcode core data class 【发布时间】:2014-05-22 14:18:00 【问题描述】:

我正在将现有的 ios 应用程序移植到 Core Data(Xcode 5、Mavericks、iOS 7.1+)。我需要导入现有的 sqlite3 数据库。我正在自动生成模型文件,然后用数据库中的数据填充它们。

我有一个包含标量类型的自动生成类(我在自动生成时选中了使用标量框):

@interface Details : NSManagedObject

@property (nonatomic) float heightInches;
…

自动生成实现了这个属性:

@implementation Details

@dynamic heightInches;
…

然后我尝试使用数据库中的浮点数为该属性设置一个值:

Details* details = [NSEntityDescription insertNewObjectForEntityForName:@“Details” inManagedObjectContext:context];
[details setHeightInches:(float)sqlite3_column_double(statement, 10)];
…

当此行执行时,我收到以下运行时错误:

'NSInvalidArgumentException',原因:'不可接受的值类型 属性:property = "heightInches";所需类型 = NSNumber;给定 类型 = NSManagedObject;价值 = (实体:详细信息;id:0x1002286a0 ;数据: 高度英寸 = 0; …

如果我重新定义实现,我会得到相同的运行时错误:

@synthesize heightInches;

如果我尝试传入 NSNumber 而不是浮点数,则会收到编译时错误(类型不匹配):

[details setHeightInches:[NSNumber numberWithFloat:(float)sqlite3_column_double(statement, 10)]];

当数据类型是浮点数时,为什么 Core Data 需要一个 NSNumber?为什么 Core Data 将我传入的浮点数视为 NSManagedObject? int32_t 值似乎有效。花车有什么特别需要我做的吗?

谢谢

【问题讨论】:

能不能放弃标量类型,改成NSNumber? 是的。在我尝试编写自己的 getter 和 setter 之后,我会尝试这样做。我只是不愿意在游戏初期就放弃一些核心数据优势。 明白了。但我认为核心数据优势在于允许您表示对象而不是数字。 NSNumber 的一个优点是您可以将 nil(与 0.00 相比)作为不同的状态。 简单的 getter 和 setter 产生相同的运行时错误。使用 NSNumber 有效。这是科学数据。不会出现空值。我宁愿不必无休止地输入 integerValue 和 floatValue :( 我想知道它是否在源数据中标量的格式设置上出错了。无论如何,我认为 NSNumbers 是一个不错的选择。对不起,我没有回答你真正的问题。 (我是核心数据爱好者)。 【参考方案1】:

我将采取一种有点逆向的方法,并争辩说没关系,因为即使尝试以这种方式做事,您也会做出错误的设计决定。

您在评论中提到这是科学数据。但是您将其分配给 float,由于在浮点变量中表示十进制值的常见问题,这会导致精度不足。

您应该做的是将数据模型中的属性声明为Decimal。当您生成将表示为 NSDecimalNumber 的子类时(没有等效的标量,因此选中该框不会有任何区别)。 NSDecimalNumber 肯定不是完美的,但在你有十进制值并且真正关心精度的情况下(例如:科学、金融),它是正确的选择。

至于在这种情况下到底出了什么问题,我并不完全确定。使用setHeightInches 应该完全按照您的预期工作。您的错误消息表明发生的事情比您问题中的详细信息所暗示的要多,因为它并没有抱怨想要NSNumber 而不是float。它抱怨它收到了 NSManagedObject 作为值,但代码 sn-p 没有显示。不过没关系,因为在这种情况下float 仍然是错误的选择。

【讨论】:

以上是关于xcode核心数据类中的数据类型不匹配的主要内容,如果未能解决你的问题,请参考以下文章

使用访问数据类型自动编号的条件表达式c#中的数据类型不匹配

在线急等:“标准表达式中数据类型不匹配。”

VB 2008 中的数据类型不匹配

条件表达式 Oledb Access 数据库中的数据类型不匹配

试图跟踪条件表达式中的数据类型不匹配

条件表达式中的数据类型不匹配