Çift SharedPreferences koyamıyorum


90

Hata alma, bu tür bir sharedPreferences editörü için çift koyma yöntemi tanımsızdır.Eclipse'e hızlı bir düzeltme verilir ve editöre cast eklenir, ancak bunu yaptığımda hala verilen hatalar, Neden double koyamıyorum.

Kod:

@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();
}

2
Lütfen hangi hatanız olduğunu belirtir misiniz?
dumbfingers

1
Sorunun ilk satırına bakın
Robert

Android adamlarının API'de putDouble'ı nasıl uygulamadığını merak ediyorum?
luky

Yanıtlar:


339

PutFloat ve getFloat kullanmayı önerenler maalesef çok yanılıyorlar. Bir şamandıraya duble çevirmek,

  1. Kayıp hassasiyet
  2. Taşma
  3. Alt akış
  4. Ölü yavru kedi

Bir toString önerenler ve parseString önerenler yanlış değil, ancak verimsiz bir çözüm.

Bununla başa çıkmanın doğru yolu, ikiliyi 'ham uzun bit' eşdeğerine dönüştürmek ve o kadar uzun depolamaktır. Değeri okurken, tekrar ikiye dönüştürün.

İki veri türü aynı boyuta sahip olduğundan, hassasiyeti kaybetmezsiniz ve {over, under} akışına neden olmazsınız.

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)));
}

Alternatif olarak alıcıyı şu şekilde yazabilirsiniz:

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

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

9
Çok güzel, temiz ve zarif.
Bogdan Alexandru

9
Bir putDouble yöntemi, android ekosistemindeki diğer API'lerle (ayrıştırılabilir ve paketler gibi) yine de güzel ve tutarlı olacaktır. Google'ın tekrar hızlı ve özensiz olduğu tipik bir durum.

2
neden dizge olarak kaydetmek verimsizdir?
KKO

2
@KKO Uzun veri tipi 64-bit ikinin tümleyen tamsayısıdır. Yani sadece 4 bayt alır. Ancak bu doubledeğeri bir dizge olarak saklarsanız, deponuzu mahvedersiniz ve onu bir enkaza çevirirsiniz !!
şemsamot

1
prefs.getLong (key, 0d) yanlış, double değil. d olmadan olmalıdır.
Ahmed Hegazy

28

Kotlin uzantı yolu (garip araç sınıflarını kullanmaktan çok daha güzel)

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)))

2
Harika, tam olarak bunu buraya koymayı düşünüyordum. Teşekkürler!
wzieba

16

Yaptığım şey tercihi bir String olarak kaydetmekti:

getSharedPreferences("PREFERENCE", MODE_PRIVATE).edit().putString("double", "0.01").commit();

ve daha sonra ikiliyi almak için Double.parseDouble kullanın:

Double.parseDouble(getSharedPreferences("PREFERENCE", MODE_PRIVATE).getString("double", "0.01"));

4
Depoyu boşa harcıyorsun. Ayrıca daha doubleToRawLongBitsönce bahsedilen yöntemden çok daha yavaştır . Bu yanlış yoldur, işe yaramayacağı için değil, çok verimsiz olduğu için.
copolii

10
@copolii Akademik olarak, tabii. Pratik olarak, endüstride, vakaların% 99'unda önemli olmak için yeterince fark yaratmaz ve aslında bu, yeni birini getirirken muhtemelen daha okunabilir ve anlaşılması daha kolaydır.
Dennis L

@DennisL #PracticalDev
Aba

9

Her zaman SharedPreferences'ı uygulayabilir ve android uygulamasını kaydırabilirsiniz.

package com.company.sharedpreferences;

import android.content.Context;
import android.content.SharedPreferences;


import java.util.Map;
import java.util.Set;

public class EnhancedSharedPreferences implements SharedPreferences {

    public static class NameSpaces {
        public static String MY_FUN_NAMESPACE = "MyFunNameSpacePrefs";
    }

    public static EnhancedSharedPreferences getPreferences(String prefsName) {
        return new EnhancedSharedPreferences(SomeSingleton.getInstance().getApplicationContext().getSharedPreferences(prefsName, Context.MODE_PRIVATE));
    }

    private SharedPreferences _sharedPreferences;

    public EnhancedSharedPreferences(SharedPreferences sharedPreferences) {
        _sharedPreferences = sharedPreferences;
    }

    //region Overrides

    @Override
    public Map<String, ?> getAll() {
        return _sharedPreferences.getAll();
    }

    @Override
    public String getString(String key, String defValue) {
        return _sharedPreferences.getString(key, defValue);
    }

    @Override
    public Set<String> getStringSet(String key, Set<String> defValues) {
        return _sharedPreferences.getStringSet(key, defValues);
    }

    @Override
    public int getInt(String key, int defValue) {
        return _sharedPreferences.getInt(key, defValue);
    }

    @Override
    public long getLong(String key, long defValue) {
        return _sharedPreferences.getLong(key, defValue);
    }

    @Override
    public float getFloat(String key, float defValue) {
        return _sharedPreferences.getFloat(key, defValue);
    }

    @Override
    public boolean getBoolean(String key, boolean defValue) {
        return _sharedPreferences.getBoolean(key, defValue);
    }

    @Override
    public boolean contains(String key) {
        return _sharedPreferences.contains(key);
    }

    @Override
    public Editor edit() {
        return new Editor(_sharedPreferences.edit());
    }

    @Override
    public void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) {
        _sharedPreferences.registerOnSharedPreferenceChangeListener(listener);
    }

    @Override
    public void unregisterOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) {
        _sharedPreferences.unregisterOnSharedPreferenceChangeListener(listener);
    }

    //endregion

    //region Extension

    public Double getDouble(String key, Double defValue) {
        return Double.longBitsToDouble(_sharedPreferences.getLong(key, Double.doubleToRawLongBits(defValue)));
    }

    //endregion

    public static class Editor implements SharedPreferences.Editor {

        private SharedPreferences.Editor _editor;

        public Editor(SharedPreferences.Editor editor) {
            _editor = editor;
        }

        private Editor ReturnEditor(SharedPreferences.Editor editor) {
            if(editor instanceof Editor)
                return (Editor)editor;
            return new Editor(editor);
        }

        //region Overrides

        @Override
        public Editor putString(String key, String value) {
            return ReturnEditor(_editor.putString(key, value));
        }

        @Override
        public Editor putStringSet(String key, Set<String> values) {
            return ReturnEditor(_editor.putStringSet(key, values));
        }

        @Override
        public Editor putInt(String key, int value) {
            return ReturnEditor(_editor.putInt(key, value));
        }

        @Override
        public Editor putLong(String key, long value) {
            return ReturnEditor(_editor.putLong(key, value));
        }

        @Override
        public Editor putFloat(String key, float value) {
            return ReturnEditor(_editor.putFloat(key, value));
        }

        @Override
        public Editor putBoolean(String key, boolean value) {
            return ReturnEditor(_editor.putBoolean(key, value));
        }

        @Override
        public Editor remove(String key) {
            return ReturnEditor(_editor.remove(key));
        }

        @Override
        public Editor clear() {
            return ReturnEditor(_editor.clear());
        }

        @Override
        public boolean commit() {
            return _editor.commit();
        }

        @Override
        public void apply() {
            _editor.apply();
        }

        //endregion

        //region Extensions

        public Editor putDouble(String key, double value) {
            return new Editor(_editor.putLong(key, Double.doubleToRawLongBits(value)));
        }

        //endregion
    }
}

Bu doğru cevap. Keşke bunu yazmaya başlamadan önce görmüş olsaydım. Editör yöntemlerinde sadece 'bunu' döndürmek daha verimli olmaz mıydı? Sizi "instanceof" yöntemini çağırmaktan kurtarır. Yoksa bunu denediniz ve sorun yarattı mı?
copolii

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.