gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:45:19 34 4
gpt4 key购买 nike

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

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

@interface Details : NSManagedObject

@property (nonatomic) float heightInches;

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

@implementation Details

@dynamic heightInches;

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

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

当执行这一行时,我得到以下运行时错误:

'NSInvalidArgumentException', reason: 'Unacceptable type of value for attribute: property = "heightInches"; desired type = NSNumber; given type = NSManagedObject; value = (entity: Details; id: 0x1002286a0 ; data: { heightInches = 0; …

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

@synthesize heightInches;

如果我尝试传入一个 NSNumber 而不是一个 float ,我会得到一个编译时错误(类型不匹配):

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

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

谢谢

最佳答案

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

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

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

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

关于ios - xcode 核心数据类中的数据类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23809462/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com