【问题标题】:Unable to save and retreive Double from storage无法从存储中保存和检索 Double
【发布时间】:2021-03-29 01:20:39
【问题描述】:

我总是收到这个错误java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long

  val sharedPreferences = getSharedPreferences("prefs", MODE_PRIVATE)
  val editor = sharedPreferences.edit()
  var myLongitude = 36.892672
  editor.putDouble("longitude", myLongitude)
  editor.apply()

错误来自这里:

val savedLongitude : Double = sharedPreferences.getDouble("longitude", 0.0)

我有这些方法:

 fun SharedPreferences.Editor.putDouble(key: String, double: Double) =
          putLong(key, java.lang.Double.doubleToRawLongBits(double))

  fun SharedPreferences.getDouble(key: String, default: Double) =
          java.lang.Double.longBitsToDouble(getLong(key, java.lang.Double.doubleToRawLongBits(default)))

我的目标是将双精度值保存到 SharedPref 然后检索它

【问题讨论】:

  • 您使用不同的键保存和检索值
  • 另外,我不知道你是如何在 kotlin 中做到这一点的,但是在 java 中你应该在 putString(key, value) 之后调用 .commit
  • 对不起,我编辑了问题
  • 好的,String.valueOf(double) 代替 double.toString 怎么样?
  • 是的,我之前尝试过,但我仍然得到同样的错误

标签: android kotlin sharedpreferences


【解决方案1】:

您可以使用非常优雅的方法。 https://stackoverflow.com/a/18098090/5422725 这是 java 的变体。但如果你使用 kotlin,你可以使用扩展使其更清晰。

Kotlin 扩展方式(比使用奇怪的 utils 类或其他方式漂亮得多)

fun SharedPreferences.Editor.putDouble(key: String, double: Double) =
    putLong(key, java.lang.Double.doubleToRawLongBits(double))

fun SharedPreferences.getDouble(key: String, default: Double) =
    java.lang.Double.longBitsToDouble(getLong(key, java.lang.Double.doubleToRawLongBits(default)))

enter link description here

【讨论】:

  • 是的,我以前见过这个但我得到了一个类似的错误:java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
【解决方案2】:

这样做可以将双倍值存储到首选项

 final Editor editor = getPreferences().edit();
 editor.putLong(key, Double.doubleToRawLongBits(value));
 editor.apply();

Double.doubleToRawLongBits() 是

返回指定浮点值的表示形式 根据 IEEE 754 浮点“双格式”位布局, 保留非数字 (NaN) 值。

要从首选项中获得双重价值,请使用此

Double.longBitsToDouble(getPreferences().getLong(key, Double.doubleToLongBits(defValue)));

【讨论】:

  • 是的,我以前见过这个但我得到了一个类似的错误:java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
  • 你传递给value的值是什么?
  • 一个Double
  • 发布代码,说明您的操作方式以及此错误在哪一行抛出
  • 查看如何从偏好中获得双倍价值的编辑答案
猜你喜欢
  • 1970-01-01
  • 2015-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-14
相关资源
最近更新 更多