ডাবল শেয়ারডপ্রিফারেন্স রাখতে পারবেন না


90

ত্রুটি পেতে, পদ্ধতিটি ডাবল করা এই জাতীয় ভাগ করা পছন্দসই সম্পাদকের জন্য অপরিজ্ঞাত cl

কোড:

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

4
আপনি কি ত্রুটি পেয়েছেন দয়া করে নির্দিষ্ট করতে পারেন?
ডাম্বফিংগাররা

4
প্রশ্নের প্রথম লাইনটি দেখুন
রবার্ট

আমি ভাবছি কীভাবে আসে যে অ্যান্ড্রয়েড ছেলেরা এপিআই-তে পুটডুবল প্রয়োগ করেনি?
লুকি

উত্তর:


336

যারা পুটফ্লোট এবং গেটফ্লোট ব্যবহারের পরামর্শ দিয়েছেন তারা দুর্ভাগ্যক্রমে খুব ভুল। একটি ফ্লোটে ডাবল কাস্টিংয়ের ফলস্বরূপ

  1. যথাযথতা হারিয়েছি
  2. উপচে পড়া
  3. আন্ডারফ্লো
  4. মৃত বিড়ালছানা

একটি পরামর্শ ঐ toString এবং parseString ভুল হয় না, কিন্তু এটি একটি অদক্ষ সমাধান।

এর সাথে ডিল করার সঠিক উপায় হ'ল ডাবলটিকে তার 'কাঁচা লম্বা বিট' সমতুল্যে রূপান্তর করা এবং সেই দীর্ঘ সংরক্ষণ করা। আপনি যখন মানটি পড়ছেন, তখন আবার ডাবলে রূপান্তর করুন।

কারণ দুটি ডেটা ধরণের একই আকার থাকে আপনি যথার্থতা হারাবেন না এবং আপনি কোনও প্রবাহের বাইরে কোনও {ওভারের কারণ হবেন না।

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

বিকল্পভাবে আপনি এই লেখকটি লিখতে পারেন:

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
তাই সুন্দর, পরিষ্কার এবং মার্জিত।
বোগদান আলেকজান্দ্রু

9
অ্যানড্রয়েড ইকোসিস্টেমের মধ্যে অন্যান্য এপিআইয়ের সাথে (যেমন পার্সেবল এবং বান্ডিল) একটি পুটডুবল পদ্ধতি এখনও দুর্দান্ত এবং সামঞ্জস্যপূর্ণ হবে। গুগল আবার দ্রুত এবং ঝাপটায় থাকার একটি সাধারণ ঘটনা।

4
স্ট্রিং হিসাবে এটি সংরক্ষণ অকার্যকর কেন?
KKO

4
@ KKO দীর্ঘ তথ্য প্রকারটি একটি 64-বিট টু এর পরিপূরক পূর্ণসংখ্যা। সুতরাং এটি লাগে 4-বাইট। তবে আপনি যদি সেই doubleমানটিকে স্ট্রিং হিসাবে সঞ্চয় করেন তবে আপনি আপনার সঞ্চয়স্থানটি নষ্ট করে এটিকে ধ্বংসস্তূপে পরিণত করেন !!
সেমসামট

4
prefs.getLong (কী, 0 ডি) ভুল এটি একটি ডাবল নয়। ডি ছাড়া হওয়া উচিত।
আহমেদ হেগজি

27

কোটলিন এক্সটেনশনের উপায় (অদ্ভুত ব্যবহারের ক্লাসগুলি বা যাই হোক না কেন ব্যবহারের চেয়ে অনেক বেশি সুন্দর)

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

4
দুর্দান্ত, আমি এখানে এটি রাখার বিষয়ে ঠিক ভাবছিলাম। ধন্যবাদ!
wzieba

16

আমি যা করেছি তা হল স্ট্রিং হিসাবে পছন্দটি সংরক্ষণ করা:

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

এবং তারপরে ডাবলটি পুনরুদ্ধার করতে কেবল Double.parseDouble ব্যবহার করুন:

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

4
আপনি সঞ্চয়স্থান নষ্ট করছেন। এটি doubleToRawLongBitsইতিমধ্যে উল্লিখিত পদ্ধতিটির তুলনায় অনেক ধীর । এটি ভুল উপায়, এটি কাজ করবে না বলে নয়, তবে এটি অত্যন্ত অদক্ষ।
কোপোলি

10
@ কোপোলি একাডেমিকভাবে, নিশ্চিত ব্যবহারিকভাবে, শিল্পে, এটি 99% ক্ষেত্রে সত্যিকার অর্থে যথেষ্ট পার্থক্য তৈরি করে না এবং বাস্তবে এটি কোনও নতুন কাউকে নিয়ে আসার সময় সম্ভবত এটি আরও পঠনযোগ্য এবং সহজেই উপলব্ধি করা যায়।
ডেনিস এল

@ ডেনিসল # প্রাকটিক্যালদেব
আবা

9

আপনি সর্বদা SharedPreferences প্রয়োগ করতে এবং অ্যান্ড্রয়েড বাস্তবায়ন মোড়ানো করতে পারে।

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

এটা সঠিক উত্তর. টাইপিং শুরুর আগে আমি এটি দেখতে পেতাম। সম্পাদক পদ্ধতিগুলিতে কেবল 'এটি' ফিরিয়ে দেওয়া কি আরও দক্ষ হবে না? এটি আপনাকে 'উদাহরণস্বরূপ' পদ্ধতিটি কল করা থেকে বাঁচায়। বা আপনি কি এটি চেষ্টা করেছেন এবং এটি সমস্যার সৃষ্টি করেছে?
কোপোলি

0

এই টুকরো পরীক্ষা করুন https://gist.github.com/john1jan/b8cb536ca51a0b2aa1da4e81566869c4 দেখুন

আমি একটি পছন্দসই ইউটিস ক্লাস তৈরি করেছি যা সমস্ত ক্ষেত্রে পরিচালনা করবে।

এটি ব্যবহার করা সহজ

অগ্রাধিকার মধ্যে সংরক্ষণ করা

PrefUtils.saveToPrefs(getActivity(), PrefKeys.USER_INCOME, income);

পছন্দ থেকে প্রাপ্ত

Double income = (Double) PrefUtils.getFromPrefs(getActivity(), PrefKeys.USER_INCOME, new Double(10));
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.