android - 不能放双 SharedPreferences

标签 android sharedpreferences

出现错误,这种类型的 sharedPreferences 编辑器的 put double 方法未定义。Eclipse 提供了一个快速修复添加强制转换到编辑器,但是当我这样做时它仍然给出错误,为什么我不能放 double。

代码:

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();

    if (TextUtils.isEmpty(editBl.getText().toString())) {
        numberOfBl = 0;
    } else {
        numberOfBl = Integer.parseInt(editBl.getText().toString();

    }
    if (TextUtils.isEmpty(editSt.getText().toString())) {
        tonOfSt = 0;
    } else {
        tonOfSt = Double.parseDouble(editSt.getText().toString());

    }

    SharedPreferences prefs = getSharedPreferences(
            "SavedTotals", Context.MODE_PRIVATE);

    SharedPreferences.Editor editor = prefs.edit();

    editor.putInt("savedBl", numberOfBl);
    editor.putDouble("savedSt", tonOfSt);


    editor.commit();
}

最佳答案

不幸的是,那些建议使用 putFloatgetFloat 的人大错特错。将 double 转换为 float 会导致

  1. 丢失精度
  2. 溢出
  3. 下溢
  4. 死猫

那些建议 toStringparseString 的人并没有错,但这是一个低效的解决方案。

处理这个问题的正确方法是将 double 转换为其“原始长位”等效值并存储该长整数。当您读取该值时,将其转换回双倍。

因为这两种数据类型具有相同的大小,所以不会丢失精度,也不会导致 {over,under}flow。

Editor putDouble(final Editor edit, final String key, final double value) {
   return edit.putLong(key, Double.doubleToRawLongBits(value));
}

double getDouble(final SharedPreferences prefs, final String key, final double defaultValue) {
return Double.longBitsToDouble(prefs.getLong(key, Double.doubleToLongBits(defaultValue)));
}

或者,您可以将 getter 编写为:

double getDouble(final SharedPreferences prefs, final String key, final double defaultValue) {
if ( !prefs.contains(key))
        return defaultValue;

return Double.longBitsToDouble(prefs.getLong(key, 0));
}

关于android - 不能放双 SharedPreferences,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16319237/

相关文章:

android - 登录/注销功能问题

android - 与在Android上提供API的Node.js服务器建立安全连接

安卓 : detect click event at empty space of gridview inside linearlayout

用于音频的 Android 事件监听器

android - 防止复制图像保存到 SD 卡

java - 从 Android ListView 中删除一个项目

android - 在android中显示二维按钮数组

android - AChartEngine TimeSeries 问题与 x 轴上的日期

flutter - 如何将提供者的数据设置为Flutter中存储在SharedPreferences中的数据?

安卓 - ClassCastException?