不能在 NSManagedObject 中存储双倍

Posted

技术标签:

【中文标题】不能在 NSManagedObject 中存储双倍【英文标题】:Cant store double in NSManagedObject 【发布时间】:2014-08-29 13:09:06 【问题描述】:

尝试在对象中存储双精度时出现错误

 error Sending 'double' to parameter of incompatible type 'id'

我的代码是:

    NSManagedObjectContext *context = [self managedObjectContext];
    NSManagedObject *newDevice = [NSEntityDescription insertNewObjectForEntityForName:@"Contacts"     inManagedObjectContext:context];

    [newDevice setValue:longitudes forKey:@"longitude"];
    [newDevice setValue:latitudes  forKey:@"latitude"];


setValue:longitudes 

longitudes 是 double 类型。

【问题讨论】:

longitudeslatitudes的类型是什么? [newDevice setValue:@(longitudes) forKey:@"longitude"];[newDevice setValue:@(latitudes) forKey:@"latitude"];,也许? 好的,您不能将原始类型的值传递给-setValue:forKey: 方法。值应该是 id 类型(任何 Objective-c 类)。 Ho to cast double to NSNumber 已在其他答案中显示。 附带说明:您可以继承 NSManagedObject(使用 XCode 的生成器)。然后,您将拥有显式类型的属性,这使开发更容易。 【参考方案1】:

你需要使用 NSNumber 来存储双精度值。

NSManagedObjectContext *context = [self managedObjectContext];
NSManagedObject *newDevice = [NSEntityDescription insertNewObjectForEntityForName:@"Contacts"     inManagedObjectContext:context];

[newDevice setValue:@(longitudes) forKey:@"longitude"];
[newDevice setValue:@(latitudes)  forKey:@"latitude"];

所以它应该可以工作。

你也可以写:

NSNumber *longitudesNumber = [NSNumber numberWithDouble:longitudes];
NSNumber *latitudesNumber = [NSNumber numberWithDouble:latitudes];
[newDevice setValue: longitudesNumber forKey:@"longitude"];
[newDevice setValue: latitudesNumber   forKey:@"latitude"];

更好理解:)

要显示,你可以使用:

NSNumber *number = ...(your object);

label.text = [NSString stringWithFormat:@"%@", number];
label.text = [NSString stringWithFormat:@"%f", [number doubleValue]];

【讨论】:

@Matz 再问一个问题,如果我想将 label.text 转换为 double 可能吗?? @Matz [newDevice setValue:self.longitudelable.text forKey:@"descrip"]; 我想将此行添加到上面我首先发布的对象中,但我需要的值是一个标签,我想将其转换为双精度以便将其保存在数据库中 好的。使用 @([self.longitudelable.text doubleValue]) 并将其放入您的对象中。 我想将 longitudelabel 转换为 double 有没有办法做到这一点?【参考方案2】:

你可以这样做

[newDevice setValue:[NSNumber numberWithDouble:longitudes] forKey:@"longitude"];
[newDevice setValue:[NSNumber numberWithDouble:latitudes]  forKey:@"latitude"];

【讨论】:

如果我想将 label.text 转换为 double 是否有可能?? 是的,你可以像这样转换它 double aDval = [label.text doubleValue];【参考方案3】:

您的代码:

[newDevice setValue:longitudes forKey:@"longitude"];

...正在使用key-value coding method 来设置值,并且键值编码方法需要值对象。这是setValue:forKey: 的方法签名:

- (void)setValue:(id)value forKey:(NSString *)key

发生异常是因为您将 double 传递给 value 参数。您的 NSManagedObject 子类可以并且应该使用标量而不是 NSNumber 来表示双精度数,如果不先将值包装在 NSValue 类中,就不能使用setValue:forKey:。但是,您可以使用传统符号或点符号来设置双精度值:

[newDevice setLongitude:longitudes];

newDevice.longitude = longitudes;

【讨论】:

以上是关于不能在 NSManagedObject 中存储双倍的主要内容,如果未能解决你的问题,请参考以下文章

将 NSManagedObject 存储在字典中(NSDictionary)

为啥我不能在 NSManagedObject 子类计算属性中使用关系? (核心数据,迅速)

NSManagedObject 和 Codable 用于存储在服务器和本地存储中的类

NSManagedObject 不能符合 Swift 中的协议

在 Swift 中将存储属性添加到 NSManagedObject 的子类

CoreData - NSManagedObject 子对象一次只存储在一个对象中