【问题标题】:Cant store double in NSManagedObject不能在 NSManagedObject 中存储双倍
【发布时间】:2023-03-27 13:40:01
【问题描述】:

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

 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 的生成器)。然后,您将拥有显式类型的属性,这使开发更容易。

标签: ios objective-c xcode core-data xcode6


【解决方案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;

【讨论】:

    猜你喜欢
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多