Android SharedPreferences কীভাবে বস্তু সংরক্ষণ / সঞ্চয় করে


215

আমাদের অনেক স্থানে ব্যবহারকারীর জিনিসগুলি পাওয়া দরকার, যাতে অনেকগুলি ক্ষেত্র রয়েছে। লগইন করার পরে, আমি এই ব্যবহারকারী বিষয়গুলি সংরক্ষণ / সঞ্চয় করতে চাই। কীভাবে আমরা এই ধরণের পরিস্থিতি বাস্তবায়ন করতে পারি?

আমি এটি এইভাবে সঞ্চয় করতে পারি না:

SharedPreferences.Editor prefsEditor = myPrefs.edit();
prefsEditor.putString("BusinessUnit", strBusinessUnit);

আপনি কোন ধরণের ডেটা সঞ্চয় করতে চান?
ইলঙ্গো জে


আপনি and " এবং এক্সিকিউটিভ অবজেক্ট " বলতে কী বুঝিয়েছেন ? স্ট্যাকওভারফ্লোতে পোস্ট করার আগে দয়া করে আপনার ব্যাকরণটি পরীক্ষা করুন।
ইগোরগানাপলস্কি

আপনি এই লাইব্রেরিটি ব্যবহার করতে পারেন যার অনেকগুলি বৈশিষ্ট্য রয়েছে ... github.com/moinkhan-in/PreferencesSpider
Moinkhan

উত্তর:


547

শ্রেণিবদ্ধ জিনিসগুলিকে SharedPreferences এ সংরক্ষণ করতে আপনি gson.jar ব্যবহার করতে পারেন । আপনি এই জারটি গুগল-জিএসএন থেকে ডাউনলোড করতে পারেন

বা আপনার গ্রেডল ফাইলে GSON নির্ভরতা যুক্ত করুন:

implementation 'com.google.code.gson:gson:2.8.5'

একটি ভাগ করা পছন্দ তৈরি করা:

SharedPreferences  mPrefs = getPreferences(MODE_PRIVATE);

বাঁচাতে:

MyObject myObject = new MyObject;
//set variables of 'myObject', etc.

Editor prefsEditor = mPrefs.edit();
Gson gson = new Gson();
String json = gson.toJson(myObject);
prefsEditor.putString("MyObject", json);
prefsEditor.commit();

পুনরুদ্ধার করা:

Gson gson = new Gson();
String json = mPrefs.getString("MyObject", "");
MyObject obj = gson.fromJson(json, MyObject.class);

9
ধন্যবাদ বন্ধু! তবে আপনি সেভ অংশে (লাইন 3) ভুল আছেন, সঠিক কোডটি: স্ট্রিং জসন = gson.toJson (মাইবজেক্ট);
সিজারফেরির

আপনার কি সব 3 জারের দরকার? সেই লিঙ্কটিতে তাদের মধ্যে 3 জন রয়েছে। । ।
coolcool1994

3
জারটি ডাউনলোডের জন্য সঠিক ইউআরএলটি হ'ল: অনুসন্ধান. maven.org/…
শজিল আফজাল

2
এই এখানে StackOverFlowException xD পড়ুন বিশালাকার সার্কুলার রেফারেন্স সঙ্গে একটি সমস্যা আছে stackoverflow.com/questions/10209959/...
phuwin

1
@রোজিনা হ্যাঁ জিএসন আরও ভাল। প্রথমে সিরিয়ালাইজ ব্যবহার করার জন্য, বস্তু এবং এর অভ্যন্তরের প্রতিটি বস্তুর সিরিয়ালাইজ ইন্টারফেসটি প্রয়োগ করা দরকার। এটি গসনের জন্য প্রয়োজন হয় না। যখন আপনার অবজেক্টের অবজেক্টের একটি তালিকা হয় তখন জিএসএনও দুর্দান্ত কাজ করে।
নেভিল নাজিরেন

36

@ মুহাম্মাদআমিরালির উত্তরে যুক্ত করতে, আপনি গসন ব্যবহার করে অবজেক্টের একটি তালিকা সংরক্ষণ এবং পুনরুদ্ধার করতে পারেন

SharedPreferences এ ব্যবহারকারী-সংজ্ঞায়িত বস্তুর তালিকা সংরক্ষণ করুন

public static final String KEY_CONNECTIONS = "KEY_CONNECTIONS";
SharedPreferences.Editor editor = getPreferences(MODE_PRIVATE).edit();

User entity = new User();
// ... set entity fields

List<Connection> connections = entity.getConnections();
// convert java object to JSON format,
// and returned as JSON formatted string
String connectionsJSONString = new Gson().toJson(connections);
editor.putString(KEY_CONNECTIONS, connectionsJSONString);
editor.commit();

SharedPreferences থেকে ব্যবহারকারী-সংজ্ঞায়িত বস্তুর তালিকা পান

String connectionsJSONString = getPreferences(MODE_PRIVATE).getString(KEY_CONNECTIONS, null);
Type type = new TypeToken < List < Connection >> () {}.getType();
List < Connection > connections = new Gson().fromJson(connectionsJSONString, type);

3
সেখানে "টাইপ" কী? (তালিকার দ্বিতীয় সারিতে পান)
গঙ্গাধররা

15

আমি জানি এই থ্রেডটি কিছুটা পুরানো। তবে এটি যে কাউকে সাহায্য করবে আশা করে এই পোস্ট করতে যাচ্ছি। স্ট্রিংকে অবজেক্টটি সিরিয়ালাইজ করে আমরা শেয়ার করা পছন্দের কোনও অবজেক্টের ক্ষেত্রগুলি সংরক্ষণ করতে পারি । এখানে আমি শেয়ার করা পছন্দগুলিতে কোনও বস্তু সংরক্ষণের জন্য ব্যবহার করেছি ।GSON

পছন্দসই বিষয় সংরক্ষণ করুন:

public static void saveObjectToSharedPreference(Context context, String preferenceFileName, String serializedObjectKey, Object object) {
    SharedPreferences sharedPreferences = context.getSharedPreferences(preferenceFileName, 0);
    SharedPreferences.Editor sharedPreferencesEditor = sharedPreferences.edit();
    final Gson gson = new Gson();
    String serializedObject = gson.toJson(object);
    sharedPreferencesEditor.putString(serializedObjectKey, serializedObject);
    sharedPreferencesEditor.apply();
}

পছন্দ থেকে অবজেক্ট পুনরুদ্ধার:

public static <GenericClass> GenericClass getSavedObjectFromPreference(Context context, String preferenceFileName, String preferenceKey, Class<GenericClass> classType) {
    SharedPreferences sharedPreferences = context.getSharedPreferences(preferenceFileName, 0);
    if (sharedPreferences.contains(preferenceKey)) {
        final Gson gson = new Gson();
        return gson.fromJson(sharedPreferences.getString(preferenceKey, ""), classType);
    }
    return null;
}

বিঃদ্রঃ :

আপনার গ্রেড যোগ compile 'com.google.code.gson:gson:2.6.2'করতে মনে রাখবেন dependencies

উদাহরণ :

//assume SampleClass exists
SampleClass mObject = new SampleObject();

//to store an object
saveObjectToSharedPreference(context, "mPreference", "mObjectKey", mObject);

//to retrive object stored in preference
mObject = getSavedObjectFromPreference(context, "mPreference", "mObjectKey", SampleClass.class);

হালনাগাদ:

@ শার্প_এডজ মন্তব্যগুলিতে যেমন উল্লেখ করেছেন, উপরের সমাধানটি কাজ করে না List

স্বাক্ষর করার জন্য সামান্য পরিমার্জন getSavedObjectFromPreference()- থেকে Class<GenericClass> classTypeথেকে Type classTypeএই সমাধান সাধারণ করতে হবে। পরিবর্তিত ফাংশন স্বাক্ষর,

public static <GenericClass> GenericClass getSavedObjectFromPreference(Context context, String preferenceFileName, String preferenceKey, Type classType)

প্রার্থনা করার জন্য,

getSavedObjectFromPreference(context, "mPreference", "mObjectKey", (Type) SampleClass.class)

শুভ কোডিং!


1
এটি সত্যিই সহায়ক ছিল ধন্যবাদ। এখানে যে কেউ মন্তব্য করতে আগ্রহী তার জন্য ... আমি কি সেভআইনস্ট্যান্সস্টেটে SaveObjectToSharedPreferences কে কল করা উচিত? আমার এখন এটি সেভইনস্ট্যান্সস্টেটে রয়েছে তবে, আমার অ্যাপ্লিকেশনটি প্রতি 10 সেকেন্ডে রিয়েল-টাইম ডেটা সংগ্রহ করছে, আমি একবারে একবারে একটি হিচকি পেয়েছি এবং সেভওবজেক্টটোশারেডপ্রিফারেন্সের সাহায্যে আমি যে জিনিসটি সংরক্ষণ করছি তাতে কিছু পড়া হারিয়ে যায়। সমস্ত চিন্তা স্বাগত জানাই।
ফ্র্যাঙ্ক জাম্পা

আরে @ ফ্র্যাঙ্কজাপ্পা, আপনার সমস্যাটি পুরোপুরি বুঝতে না পারলে আমাকে ক্ষমা করুন তবে এখানে আপনি যান, commitপরিবর্তে ব্যবহার করার চেষ্টা করুন apply। এটি আপনাকে সাহায্য করতে পারে।
tpk

ধন্যবাদ। আমাকে ব্যাখ্যা করার চেষ্টা করুন। আমার অ্যান্ড্রয়েড অ্যাপ্লিকেশনটি প্রতি 10 সেকেন্ডে রিয়েল-টাইমে ডেটা সংগ্রহ করে। এই ডেটা সংগ্রহটি কোনও অবজেক্ট ব্যবহার করে না, কেবল গ্লোবাল ভেরিয়েবল এবং লজিক। এরপরে ডেটা সংক্ষিপ্ত করে একটি জাভা অবজেক্টে সংরক্ষণ করা হয়। আমি আমার জাভা অবজেক্টটি SharedPreferences মধ্যে / এর মাধ্যমে সংরক্ষণ এবং পুনরুদ্ধার করতে উপরের পদ্ধতিটি ব্যবহার করি কারণ ক) আমার জ্ঞান অনুসারে আমি অনভিজ্ঞাবস্থাস্টেটে এবং অবজেক্টগুলি সংরক্ষণ করতে পারি না) যখন পর্দাটি ঘুরিয়ে দেয় তখন আমার অবজেক্টটি ধ্বংস হয়ে যায় এবং পুনরায় তৈরি হয়। অতএব, আমি আপনার শেয়ারডপ্রিফ পদ্ধতির ব্যবহার করছি তাই যখন স্ক্রিনটি ঘোরানো হয় তখন আমার বস্তুটির মানগুলি হারাবে না। (বিস্তৃত ..)
ফ্রাঙ্ক জাপা

আমি আপনার সেভওবজেক্টটোশ্রেডপ্রিফারেন্স রুটিনকে onSaveInstanceState এ রেখেছি। আমি আপনার getSedvedObjectFromPreferences রুটিনটিকে onRestoreInstanceState এ রেখেছি। যাইহোক, আমি পরীক্ষা করেছি এবং এখনও পর্দার ঘূর্ণনের কারণে মিস করা অবজেক্ট আপডেটগুলির একটি সেট পেয়েছি। অতএব, আমি কি আমার প্রকৃত যুক্তির আরও কাছে সেভঅবজেক্টটোশ্রেডপ্রিফারেন্সগুলিতে কলটি সরাতে পারি? অবশেষে কোন পদ্ধতির সাথে সম্পর্কিত এবং প্রয়োগ করা যায়?
ফ্র্যাঙ্ক জাপা

1
@ 2943 আপনার সমাধানটি দুর্দান্ত দেখাচ্ছে, তবে উদাহরণস্বরূপ যদি আমার কাছে তালিকা থাকে তবে আমার এটি List<CustomClass>কীভাবে করা উচিত? getSavedObjectFromPreference(context, "mPreference", "mObjectKey", SampleClass.class)List<CustomClass>.class
শার্প এজ

6

Constantsডেটা আনতে বা সেভ করার জন্য কী বা ভেরিয়েবলগুলি সেভ করার জন্য একটি গ্লোবাল ক্লাস করা ভাল।

ডেটা সংরক্ষণের জন্য যেকোন স্থান থেকে ডেটা সংরক্ষণ করতে এই পদ্ধতিতে কল করুন।

public static void saveData(Context con, String variable, String data)
{
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(con);
    prefs.edit().putString(variable, data).commit();
}

তথ্য পেতে এটি ব্যবহার করুন।

public static String getData(Context con, String variable, String defaultValue)
{
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(con);
    String data = prefs.getString(variable, defaultValue);
    return data;
}

এবং এর মতো একটি পদ্ধতি কৌশলটি করবে

public static User getUserInfo(Context con)
{
    String id =  getData(con, Constants.USER_ID, null);
    String name =  getData(con, Constants.USER_NAME, null);
    if(id != null && name != null)
    {
            User user = new User(); //Hope you will have a user Object.
            user.setId(id);
            user.setName(name);
            //Here set other credentials.
            return user;
    }
    else
    return null;
}

ডেটা ফিরে পেতে, আমি 'ভেরিয়েবল' এবং 'ডিফল্টভ্যালু' হিসাবে কী পাস করব?
অ্যালেক্স

কখনও কোনও কনস্ট্যান্ট ক্লাস তৈরি করবেন না। এটি আপনার কোডটিকে একই সাথে একত্রে মিশ্রিত এবং বিক্ষিপ্ত করে তোলে।
মিহা_এক্স 64

5

এই সর্বোত্তম উপায়ে চেষ্টা করুন:

PreferenceConnector.java

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

public class PreferenceConnector {
    public static final String PREF_NAME = "ENUMERATOR_PREFERENCES";
    public static final String PREF_NAME_REMEMBER = "ENUMERATOR_REMEMBER";
    public static final int MODE = Context.MODE_PRIVATE;


    public static final String name = "name";


    public static void writeBoolean(Context context, String key, boolean value) {
        getEditor(context).putBoolean(key, value).commit();
    }

    public static boolean readBoolean(Context context, String key,
            boolean defValue) {
        return getPreferences(context).getBoolean(key, defValue);
    }

    public static void writeInteger(Context context, String key, int value) {
        getEditor(context).putInt(key, value).commit();

    }

    public static int readInteger(Context context, String key, int defValue) {
        return getPreferences(context).getInt(key, defValue);
    }

    public static void writeString(Context context, String key, String value) {
        getEditor(context).putString(key, value).commit();

    }

    public static String readString(Context context, String key, String defValue) {
        return getPreferences(context).getString(key, defValue);
    }

    public static void writeLong(Context context, String key, long value) {
        getEditor(context).putLong(key, value).commit();
    }

    public static long readLong(Context context, String key, long defValue) {
        return getPreferences(context).getLong(key, defValue);
    }

    public static SharedPreferences getPreferences(Context context) {
        return context.getSharedPreferences(PREF_NAME, MODE);
    }

    public static Editor getEditor(Context context) {
        return getPreferences(context).edit();
    }

}

মান লিখুন:

PreferenceConnector.writeString(this, PreferenceConnector.name,"Girish");

এবং ব্যবহার করে মান পান:

String name= PreferenceConnector.readString(this, PreferenceConnector.name, "");

2
অ্যান্ড্রয়েডের SharedPreferences এ কোনও অবজেক্টটি সংরক্ষণ করার সাথে এর কী দরকার?
ইগোরগানাপলস্কি

Sharedpreferences সঙ্গে কাজ সম্পর্কে আরও তথ্য পাওয়া যাবে stackoverflow.com/a/2614771/1815624 নোট আপনি ব্যবহার করতে চাইতে পারেন return PreferenceManager.getDefaultSharedPreferences(context);পরিবর্তেreturn context.getSharedPreferences(PREF_NAME, MODE);
CrandellWS

3

আপনি এর prefsEditorপরে অবজেক্টটির সাথে কী করবেন তা আপনি বলেননি, তবে অগ্রাধিকারের ডেটা বজায় রাখতে আপনার ব্যবহার করতে হবে:

prefsEditor.commit();

2

এখানে দেখুন, এটি আপনাকে সহায়তা করতে পারে:

public static boolean setObject(Context context, Object o) {
        Field[] fields = o.getClass().getFields();
        SharedPreferences sp = context.getSharedPreferences(o.getClass()
                .getName(), Context.MODE_PRIVATE);
        Editor editor = sp.edit();
        for (int i = 0; i < fields.length; i++) {
            Class<?> type = fields[i].getType();
            if (isSingle(type)) {
                try {
                    final String name = fields[i].getName();
                    if (type == Character.TYPE || type.equals(String.class)) {
                        Object value = fields[i].get(o);
                        if (null != value)
                            editor.putString(name, value.toString());
                    } else if (type.equals(int.class)
                            || type.equals(Short.class))
                        editor.putInt(name, fields[i].getInt(o));
                    else if (type.equals(double.class))
                        editor.putFloat(name, (float) fields[i].getDouble(o));
                    else if (type.equals(float.class))
                        editor.putFloat(name, fields[i].getFloat(o));
                    else if (type.equals(long.class))
                        editor.putLong(name, fields[i].getLong(o));
                    else if (type.equals(Boolean.class))
                        editor.putBoolean(name, fields[i].getBoolean(o));

                } catch (IllegalAccessException e) {
                    LogUtils.e(TAG, e);
                } catch (IllegalArgumentException e) {
                    LogUtils.e(TAG, e);
                }
            } else {
                // FIXME 是对象则不写入
            }
        }

        return editor.commit();
    }

https://github.com/AltasT/PreferenceVObjectFile/blob/master/PreferenceVObjectFile/src/com/altas/lib/PreferenceUtils.java


2
আপনি কোডটি আরও কিছুটা ব্যাখ্যা করতে পারছেন কারণ এটি বর্তমানে কেবল "একগুচ্ছ কোড" উপস্থাপন করে।
ওয়ার্নার

1

জসন ফর্ম্যাটটি ব্যবহার না করে অ্যান্ড্রয়েডের ভাগীকরণ থেকে কোনও বিষয় সংরক্ষণ এবং পুনরুদ্ধার করার অন্য একটি উপায়

private static ExampleObject getObject(Context c,String db_name){
            SharedPreferences sharedPreferences = c.getSharedPreferences(db_name, Context.MODE_PRIVATE);
            ExampleObject o = new ExampleObject();
            Field[] fields = o.getClass().getFields();
            try {
                for (Field field : fields) {
                    Class<?> type = field.getType();
                    try {
                        final String name = field.getName();
                        if (type == Character.TYPE || type.equals(String.class)) {
                            field.set(o,sharedPreferences.getString(name, ""));
                        } else if (type.equals(int.class) || type.equals(Short.class))
                            field.setInt(o,sharedPreferences.getInt(name, 0));
                        else if (type.equals(double.class))
                            field.setDouble(o,sharedPreferences.getFloat(name, 0));
                        else if (type.equals(float.class))
                            field.setFloat(o,sharedPreferences.getFloat(name, 0));
                        else if (type.equals(long.class))
                            field.setLong(o,sharedPreferences.getLong(name, 0));
                        else if (type.equals(Boolean.class))
                            field.setBoolean(o,sharedPreferences.getBoolean(name, false));
                        else if (type.equals(UUID.class))
                            field.set(
                                    o,
                                    UUID.fromString(
                                            sharedPreferences.getString(
                                                    name,
                                                    UUID.nameUUIDFromBytes("".getBytes()).toString()
                                            )
                                    )
                            );

                    } catch (IllegalAccessException e) {
                        Log.e(StaticConfig.app_name, "IllegalAccessException", e);
                    } catch (IllegalArgumentException e) {
                        Log.e(StaticConfig.app_name, "IllegalArgumentException", e);
                    }
                }
            } catch (Exception e) {
                System.out.println("Exception: " + e);
            }
            return o;
        }
        private static void setObject(Context context, Object o, String db_name) {
            Field[] fields = o.getClass().getFields();
            SharedPreferences sp = context.getSharedPreferences(db_name, Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = sp.edit();
            for (Field field : fields) {
                Class<?> type = field.getType();
                try {
                    final String name = field.getName();
                    if (type == Character.TYPE || type.equals(String.class)) {
                        Object value = field.get(o);
                        if (value != null)
                            editor.putString(name, value.toString());
                    } else if (type.equals(int.class) || type.equals(Short.class))
                        editor.putInt(name, field.getInt(o));
                    else if (type.equals(double.class))
                        editor.putFloat(name, (float) field.getDouble(o));
                    else if (type.equals(float.class))
                        editor.putFloat(name, field.getFloat(o));
                    else if (type.equals(long.class))
                        editor.putLong(name, field.getLong(o));
                    else if (type.equals(Boolean.class))
                        editor.putBoolean(name, field.getBoolean(o));
                    else if (type.equals(UUID.class))
                        editor.putString(name, field.get(o).toString());

                } catch (IllegalAccessException e) {
                    Log.e(StaticConfig.app_name, "IllegalAccessException", e);
                } catch (IllegalArgumentException e) {
                    Log.e(StaticConfig.app_name, "IllegalArgumentException", e);
                }
            }

            editor.apply();
        }

1

আপনি কোনও লাইব্রেরি ব্যবহার না করে পছন্দগুলিতে অবজেক্ট সংরক্ষণ করতে পারেন, আপনার সমস্ত বস্তুর শ্রেণীর প্রথমে সিরিয়ালাইজেবল প্রয়োগ করতে হবে:

public class callModel implements Serializable {

private long pointTime;
private boolean callisConnected;

public callModel(boolean callisConnected,  long pointTime) {
    this.callisConnected = callisConnected;
    this.pointTime = pointTime;
}
public boolean isCallisConnected() {
    return callisConnected;
}
public long getPointTime() {
    return pointTime;
}

}

তারপরে আপনি সহজেই স্ট্রিং এবং স্ট্রিংকে অবজেক্টে রূপান্তর করতে এই দুটি পদ্ধতি ব্যবহার করতে পারেন:

 public static <T extends Serializable> T stringToObjectS(String string) {
    byte[] bytes = Base64.decode(string, 0);
    T object = null;
    try {
        ObjectInputStream objectInputStream = new ObjectInputStream(new ByteArrayInputStream(bytes));
        object = (T) objectInputStream.readObject();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return object;
}

 public static String objectToString(Parcelable object) {
    String encoded = null;
    try {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
        objectOutputStream.writeObject(object);
        objectOutputStream.close();
        encoded = new String(Base64.encodeToString(byteArrayOutputStream.toByteArray(), 0));
    } catch (IOException e) {
        e.printStackTrace();
    }
    return encoded;
}

বাঁচাতে:

SharedPreferences  mPrefs = getPreferences(MODE_PRIVATE);
Editor prefsEditor = mPrefs.edit();
prefsEditor.putString("MyObject", objectToString(callModelObject));
prefsEditor.commit();

পড়তে

String value= mPrefs.getString("MyObject", "");
MyObject obj = stringToObjectS(value);

এই ব্যাইটগুলি আলাদা একটি ফাইলে লিখে আপনি বেস 64 এনকোডিং এবং এক্সএমএল এড়িয়ে যাওয়া এড়াতে পারেন।
মিহা_এক্স 64

1

পদক্ষেপ 1: আপনার জাভা ফাইলে এই দুটি ফাংশনটি অনুলিপি করুন Copy

 public void setDefaults(String key, String value, Context context) {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        SharedPreferences.Editor editor = preferences.edit();
        editor.putString(key, value);
        editor.commit();
    }


    public static String getDefaults(String key, Context context) {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        return preferences.getString(key, null);
    }

পদক্ষেপ 2: ব্যবহার বাঁচাতে:

 setDefaults("key","value",this);

ব্যবহার পুনরুদ্ধার করতে:

String retrieve= getDefaults("key",this);

আপনি বিভিন্ন কী নাম ব্যবহার করে বিভিন্ন ভাগ করা পছন্দগুলি সেট করতে পারেন:

setDefaults("key1","xyz",this);

setDefaults("key2","abc",this);

setDefaults("key3","pqr",this);

1

আপনি যদি সাড়া জাগানো পুরো অবজেক্টটি সঞ্চয় করতে চান তবে এটি এমন কিছু করে অর্জন করতে পারে,

প্রথমে এমন একটি পদ্ধতি তৈরি করুন যা নীচের মত আপনার ব্যবহার শ্রেণীর স্ট্রিংয়ে আপনার JSON কে রূপান্তর করবে।

 public static <T> T fromJson(String jsonString, Class<T> theClass) {
    return new Gson().fromJson(jsonString, theClass);
}

তারপরে ভাগ করা পছন্দগুলিতে শ্রেণিতে এমন কিছু করুন,

 public void storeLoginResponse(yourResponseClass objName) {

    String loginJSON = UtilClass.toJson(customer);
    if (!TextUtils.isEmpty(customerJSON)) {
        editor.putString(AppConst.PREF_CUSTOMER, customerJSON);
        editor.commit();
    }
}

এবং তারপরে getPreferences জন্য একটি পদ্ধতি তৈরি করুন

public Customer getCustomerDetails() {
    String customerDetail = pref.getString(AppConst.PREF_CUSTOMER, null);
    if (!TextUtils.isEmpty(customerDetail)) {
        return GSONConverter.fromJson(customerDetail, Customer.class);
    } else {
        return new Customer();
    }
}

তারপরে আপনি যখন প্রতিক্রিয়া পাবেন তখন প্রথম পদ্ধতিটি কল করুন এবং দ্বিতীয়টি যখন আপনার পছন্দ পছন্দগুলি থেকে ডেটা নেওয়া দরকার

String token = SharedPrefHelper.get().getCustomerDetails().getAccessToken();

এখানেই শেষ.

আশা করি এটা তোমাকে সাহায্য করবে।

Happy Coding();


1

ক্রিয়াকলাপ জুড়ে ভাগ করে নেওয়া পছন্দসই ডেটা অ্যাক্সেসের জন্য গৃহীত উত্তরটি ব্যবহার করতে আমার সমস্যা হয়েছিল। এই পদক্ষেপগুলিতে আপনি getSharedPreferences এ প্রবেশ করার জন্য একটি নাম দেন।

গ্রেডল স্ক্রিপ্টগুলির অধীনে বিল্ড.gradel (মডিউল: অ্যাপ) ফাইলটিতে নিম্নলিখিত নির্ভরতা যুক্ত করুন:

implementation 'com.google.code.gson:gson:2.8.5'

বাঁচাতে:

MyObject myObject = new MyObject;
//set variables of 'myObject', etc.

SharedPreferences mPrefs = getSharedPreferences("Name", Context.MODE_PRIVATE);

Editor prefsEditor = mPrefs.edit();
Gson gson = new Gson();
String json = gson.toJson(myObject);
prefsEditor.putString("Key", json);
prefsEditor.commit();

একটি ভিন্ন ক্রিয়াকলাপ পুনরুদ্ধার করতে:

SharedPreferences mPrefs = getSharedPreferences("Name", Context.MODE_PRIVATE);

Gson gson = new Gson();
String json = mPrefs.getString("Key", "");
MyObject obj = gson.fromJson(json, MyObject.class);

1
// SharedPrefHelper is a class contains the get and save sharedPrefernce data
public class SharedPrefHelper {

    // save data in sharedPrefences
    public static void setSharedOBJECT(Context context, String key, 
                                           Object value) {

        SharedPreferences sharedPreferences =  context.getSharedPreferences(
                context.getPackageName(), Context.MODE_PRIVATE);

        SharedPreferences.Editor prefsEditor = sharedPreferences.edit();
        Gson gson = new Gson();
        String json = gson.toJson(value);
        prefsEditor.putString(key, json);
        prefsEditor.apply();
    }

    // get data from sharedPrefences 
    public static Object getSharedOBJECT(Context context, String key) {

         SharedPreferences sharedPreferences = context.getSharedPreferences(
                           context.getPackageName(), Context.MODE_PRIVATE);

        Gson gson = new Gson();
        String json = sharedPreferences.getString(key, "");
        Object obj = gson.fromJson(json, Object.class);
        User objData = new Gson().fromJson(obj.toString(), User.class);
        return objData;
    }
}
// save data in your activity

User user = new User("Hussein","h@h.com","3107310890983");        
SharedPrefHelper.setSharedOBJECT(this,"your_key",user);        
User data = (User) SharedPrefHelper.getSharedOBJECT(this,"your_key");

Toast.makeText(this,data.getName()+"\n"+data.getEmail()+"\n"+data.getPhone(),Toast.LENGTH_LONG).show();
// User is the class you want to save its objects

public class User {

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    private String name,email,phone;
    public User(String name,String email,String phone){
          this.name=name;
          this.email=email;
          this.phone=phone;
    }
}
// put this in gradle

compile 'com.google.code.gson:gson:2.7'

আশা করি এটি আপনাকে সাহায্য করবে :)


1

আমি এখান থেকে তুলেছি এমন কোটলিন প্রতিনিধি সম্পত্তি ব্যবহার করার জন্য এখানে একটি পদক্ষেপ নেওয়া হয়েছে , তবে এতে প্রসারিত হয়েছে এবং SharedPreferences বৈশিষ্ট্যগুলি পেতে / সেট করার জন্য একটি সহজ পদ্ধতির অনুমতি দেয়।

জন্য String, Int, Long, Floatবা Boolean, এটা মান SharePreference সংগ্রহকারী (গুলি) এবং সেটার (গুলি) ব্যবহার করে। তবে অন্যান্য সমস্ত ডেটা ক্লাসের জন্য এটি জিএসওএন ব্যবহার করে সেটারের জন্য সিরিয়ালায়িত করতে String। তারপরে গ্রাহকের জন্য ডেটা অবজেক্টে ডিসরিয়ালাইজ করা হয়।

অন্যান্য সমাধানের মতো, এর জন্য আপনার গ্রেড ফাইলটিতে নির্ভরতা হিসাবে জিএসওএন যুক্ত করা দরকার:

implementation 'com.google.code.gson:gson:2.8.6'

এখানে একটি সাধারণ ডেটা ক্লাসের একটি উদাহরণ রয়েছে যা আমরা SharedPreferences এ সংরক্ষণ এবং সঞ্চয় করতে সক্ষম হতে চাই:

data class User(val first: String, val last: String)

সম্পত্তির প্রতিনিধিদের কার্যকর করার জন্য এখানে একটি শ্রেণি রয়েছে:

object UserPreferenceProperty : PreferenceProperty<User>(
    key = "USER_OBJECT",
    defaultValue = User(first = "Jane", last = "Doe"),
    clazz = User::class.java)

object NullableUserPreferenceProperty : NullablePreferenceProperty<User?, User>(
    key = "NULLABLE_USER_OBJECT",
    defaultValue = null,
    clazz = User::class.java)

object FirstTimeUser : PreferenceProperty<Boolean>(
        key = "FIRST_TIME_USER",
        defaultValue = false,
        clazz = Boolean::class.java
)

sealed class PreferenceProperty<T : Any>(key: String,
                                         defaultValue: T,
                                         clazz: Class<T>) : NullablePreferenceProperty<T, T>(key, defaultValue, clazz)

@Suppress("UNCHECKED_CAST")
sealed class NullablePreferenceProperty<T : Any?, U : Any>(private val key: String,
                                                           private val defaultValue: T,
                                                           private val clazz: Class<U>) : ReadWriteProperty<Any, T> {

    override fun getValue(thisRef: Any, property: KProperty<*>): T = HandstandApplication.appContext().getPreferences()
            .run {
                when {
                    clazz.isAssignableFrom(String::class.java) -> getString(key, defaultValue as String?) as T
                    clazz.isAssignableFrom(Int::class.java) -> getInt(key, defaultValue as Int) as T
                    clazz.isAssignableFrom(Long::class.java) -> getLong(key, defaultValue as Long) as T
                    clazz.isAssignableFrom(Float::class.java) -> getFloat(key, defaultValue as Float) as T
                    clazz.isAssignableFrom(Boolean::class.java) -> getBoolean(key, defaultValue as Boolean) as T
                    else -> getObject(key, defaultValue, clazz)
                }
            }

    override fun setValue(thisRef: Any, property: KProperty<*>, value: T) = HandstandApplication.appContext().getPreferences()
            .edit()
            .apply {
                when {
                    clazz.isAssignableFrom(String::class.java) -> putString(key, value as String?) as T
                    clazz.isAssignableFrom(Int::class.java) -> putInt(key, value as Int) as T
                    clazz.isAssignableFrom(Long::class.java) -> putLong(key, value as Long) as T
                    clazz.isAssignableFrom(Float::class.java) -> putFloat(key, value as Float) as T
                    clazz.isAssignableFrom(Boolean::class.java) -> putBoolean(key, value as Boolean) as T
                    else -> putObject(key, value)
                }
            }
            .apply()

    private fun Context.getPreferences(): SharedPreferences = getSharedPreferences(APP_PREF_NAME, Context.MODE_PRIVATE)

    private fun <T, U> SharedPreferences.getObject(key: String, defValue: T, clazz: Class<U>): T =
            Gson().fromJson(getString(key, null), clazz) as T ?: defValue

    private fun <T> SharedPreferences.Editor.putObject(key: String, value: T) = putString(key, Gson().toJson(value))

    companion object {
        private const val APP_PREF_NAME = "APP_PREF"
    }
}

দ্রষ্টব্য: আপনার কিছুতে আপডেট করার দরকার নেই sealed class। অর্পণ বৈশিষ্ট্য অবজেক্ট / Singletons হয় UserPreferenceProperty, NullableUserPreferencePropertyএবং FirstTimeUser

SharedPreferences থেকে সংরক্ষণ / পাওয়ার জন্য একটি নতুন ডেটা অবজেক্ট সেটআপ করতে এখন চারটি লাইন যুক্ত করার মতোই সহজ:

object NewPreferenceProperty : PreferenceProperty<String>(
        key = "NEW_PROPERTY",
        defaultValue = "",
        clazz = String::class.java)

অবশেষে, আপনি কেবল byকীওয়ার্ডটি ব্যবহার করে ভাগ করে নেওয়া পছন্দগুলিতে মান লিখতে / লিখতে পারেন :

private var user: User by UserPreferenceProperty
private var nullableUser: User? by NullableUserPreferenceProperty
private var isFirstTimeUser: Boolean by 

Log.d("TAG", user) // outputs the `defaultValue` for User the first time
user = User(first = "John", last = "Doe") // saves this User to the Shared Preferences
Log.d("TAG", user) // outputs the newly retrieved User (John Doe) from Shared Preferences

0

যদি আপনার অবজেক্ট জটিল হয় তবে আমি এটির সিরিয়ালাইজ / এক্সএমএল / জেএসএন করার পরামর্শ দেব এবং এসডি কার্ডে সেগুলি সংরক্ষণ করতে পারি। : আপনি এখান থেকে এক্সটারনাল স্টোরেজে সংরক্ষণ করতে অতিরিক্ত তথ্য পেতে পারেন http://developer.android.com/guide/topics/data/data-storage.html#filesExternal


এর জন্য কি অতিরিক্ত অনুমতি (এসডি কার্ড) লাগবে না?
রিশাভ

হ্যাঁ এটি যেহেতু আপনি এসডি কার্ডে লিখবেন।
trenpixster

1
আমার অভিজ্ঞতা থেকে, ব্যবহারকারীর যত কম অনুমতি প্রয়োজন, তত ভাল। এসডি কার্ডের গৌণ পছন্দ হওয়া উচিত, যদি উপরে বর্ণিত হিসাবে গসন ব্যবহার করা কার্যকর ব্যবহারযোগ্য বিকল্প না হয়।
রিশাভ

হ্যাঁ, আমিও এর সাথে একমত; কেবলমাত্র জেএসএন ফলাফল যদি বড় হয় তবে এসডি কার্ডের বিকল্প হওয়া উচিত। এটি একটি বাণিজ্য বন্ধ আমি বলব।
trenpixster

0

ভাগ করা পছন্দগুলি সম্পর্কে আপনার সমস্ত সমস্যার সমাধান দুটি ফাইল রয়েছে

1) AppPersistence.java

    public class AppPersistence {
    public enum keys {
        USER_NAME, USER_ID, USER_NUMBER, USER_EMAIL, USER_ADDRESS, CITY, USER_IMAGE,
        DOB, MRG_Anniversary, COMPANY, USER_TYPE, support_phone
    }

    private static AppPersistence mAppPersistance;
    private SharedPreferences sharedPreferences;

    public static AppPersistence start(Context context) {
        if (mAppPersistance == null) {
            mAppPersistance = new AppPersistence(context);
        }
        return mAppPersistance;
    }

    private AppPersistence(Context context) {
        sharedPreferences = context.getSharedPreferences(context.getString(R.string.prefrence_file_name),
                Context.MODE_PRIVATE);
    }

    public Object get(Enum key) {
        Map<String, ?> all = sharedPreferences.getAll();
        return all.get(key.toString());
    }

    void save(Enum key, Object val) {
        SharedPreferences.Editor editor = sharedPreferences.edit();
        if (val instanceof Integer) {
            editor.putInt(key.toString(), (Integer) val);
        } else if (val instanceof String) {
            editor.putString(key.toString(), String.valueOf(val));
        } else if (val instanceof Float) {
            editor.putFloat(key.toString(), (Float) val);
        } else if (val instanceof Long) {
            editor.putLong(key.toString(), (Long) val);
        } else if (val instanceof Boolean) {
            editor.putBoolean(key.toString(), (Boolean) val);
        }
        editor.apply();
    }

    void remove(Enum key) {
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.remove(key.toString());
        editor.apply();
    }

    public void removeAll() {
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.clear();
        editor.apply();
    }
}

2) AppPreference.java

public static void setPreference(Context context, Enum Name, String Value) {
        AppPersistence.start(context).save(Name, Value);
    }

    public static String getPreference(Context context, Enum Name) {
        return (String) AppPersistence.start(context).get(Name);
    }

    public static void removePreference(Context context, Enum Name) {
        AppPersistence.start(context).remove(Name);
    }
}

এখন আপনি সংরক্ষণ করতে পারেন, মুছে ফেলতে বা পছন্দ মতো পেতে পারেন,

-সংরক্ষণ

AppPreference.setPreference(context, AppPersistence.keys.USER_ID, userID);

-অপসারণ

AppPreference.removePreference(context, AppPersistence.keys.USER_ID);

-পাওয়া

 AppPreference.getPreference(context, AppPersistence.keys.USER_ID);

0

SharedPreferences মধ্যে ডেটা সঞ্চয় করুন

SharedPreferences mprefs = getSharedPreferences(AppConstant.PREFS_NAME, MODE_PRIVATE)
mprefs.edit().putString(AppConstant.USER_ID, resUserID).apply();

0

সংরক্ষণের তালিকার জন্য আমার ব্যবহারের শ্রেণি SharedPreferences

public class SharedPrefApi {
    private SharedPreferences sharedPreferences;
    private Gson gson;

    public SharedPrefApi(Context context, Gson gson) {
        this.sharedPreferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
        this.gson = gson;
    } 

    ...

    public <T> void putObject(String key, T value) {
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString(key, gson.toJson(value));
        editor.apply();
    }

    public <T> T getObject(String key, Class<T> clazz) {
        return gson.fromJson(getString(key, null), clazz);
    }
}

ব্যবহার

// for save
sharedPrefApi.putList(SharedPrefApi.Key.USER_LIST, userList);

// for retrieve
List<User> userList = sharedPrefApi.getList(SharedPrefApi.Key.USER_LIST, User.class);


আমার ব্যবহারের সম্পূর্ণ কোড // কার্যকলাপ কোডে উদাহরণ ব্যবহার করে চেক করুন


0

আমি আমার জিনিসগুলি ( জ্যাকসন ) সঞ্চয় করতে জ্যাকসন ব্যবহার করেছি ।

গ্রেডে জ্যাকসন লাইব্রেরি যুক্ত করা হয়েছে:

api 'com.fasterxml.jackson.core:jackson-core:2.9.4'
api 'com.fasterxml.jackson.core:jackson-annotations:2.9.4'
api 'com.fasterxml.jackson.core:jackson-databind:2.9.4'

আমার পরীক্ষার ক্লাস:

public class Car {
    private String color;
    private String type;
    // standard getters setters
}

JSON এর কাছে জাভা অবজেক্ট:

ObjectMapper objectMapper = new ObjectMapper();
String carAsString = objectMapper.writeValueAsString(car);

এটি ভাগ করা পছন্দগুলিতে সংরক্ষণ করুন:

preferences.edit().car().put(carAsString).apply();

ভাগ করা পছন্দগুলি থেকে এটি পুনরুদ্ধার করুন:

ObjectMapper objectMapper = new ObjectMapper();
Car car = objectMapper.readValue(preferences.car().get(), Car.class);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.