SharedPreferences บันทึก / จัดเก็บวัตถุของ Android อย่างไร


216

เราจำเป็นต้องได้รับวัตถุผู้ใช้ในหลายสถานที่ซึ่งมีหลายสาขา หลังจากเข้าสู่ระบบฉันต้องการบันทึก / เก็บวัตถุผู้ใช้เหล่านี้ เราจะใช้สถานการณ์ประเภทนี้ได้อย่างไร

ฉันไม่สามารถจัดเก็บแบบนี้:

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

คุณต้องการจัดเก็บข้อมูลประเภทใด
ilango j


คุณหมายถึงอะไรโดย ~ " and Object Object " โปรดตรวจสอบไวยากรณ์ของคุณก่อนโพสต์ใน StackOverflow
IgorGanapolsky

คุณสามารถใช้ห้องสมุดนี้ซึ่งมีคุณสมบัติมากมาย ... github.com/moinkhan-in/PreferenceSpider
Moinkhan

คำตอบ:


548

คุณสามารถใช้เพื่อ gson.jar วัตถุระดับเก็บเข้าSharedPreferences คุณสามารถดาวน์โหลด jar นี้ได้จากgoogle-gson

หรือเพิ่มการพึ่งพา GSON ในไฟล์ Gradle ของคุณ:

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) รหัสที่ถูกต้องคือ: String json = gson.toJson (myObject);
cesarferreira

คุณต้องการขวดทั้ง 3 ขวดหรือไม่? มี 3 ของพวกเขาในลิงค์นั้น . .
coolcool1994

3
URL ที่ถูกต้องสำหรับการดาวน์โหลด jar คือ: search.maven.org/…
Shajeel Afzal

2
นี้มีปัญหากับการอ้างอิงแบบวงกลมที่นำไปสู่ StackOverflowException xD อ่านเพิ่มเติมได้ที่นี่stackoverflow.com/questions/10209959/...
phuwin

1
@rozina ใช่ Gson ดีกว่า ก่อนอื่นให้ใช้ซีเรียลไลซ์, วัตถุและวัตถุทุกอย่างที่อยู่ภายในนั้นจำเป็นต้องใช้อินเตอร์เฟสอนุกรม ไม่จำเป็นสำหรับ gson gson ยังใช้งานได้ดีเมื่อวัตถุของคุณเป็นรายการวัตถุ
เนวิลล์นาเซเร

36

หากต้องการเพิ่มคำตอบของ @ MuhammadAamirALi คุณสามารถใช้ Gson เพื่อบันทึกและดึงข้อมูลรายการวัตถุ

บันทึกรายการของวัตถุที่ผู้ใช้กำหนดไปยัง 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
"ประเภท" คืออะไร (ในรับรายการบรรทัดที่ 2)
gangadhars

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ใน gradle ของคุณ

ตัวอย่าง :

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

ปรับปรุง:

ในฐานะที่เป็น @Sharp_Edge ชี้ให้เห็นในความคิดเห็นวิธีการแก้ปัญหาดังกล่าวไม่สามารถทำงาน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)

Happy Coding!


1
นี่เป็นประโยชน์จริงๆขอบคุณ สำหรับทุกคนที่นี่ที่มีความคิดเห็น ... ฉันควรวางสายเพื่อบันทึก ObjectToSharedPreference ใน onSaveInstanceState หรือไม่ ฉันมีไว้ใน onSaveInstanceState ทันที แต่เนื่องจากแอปของฉันรวบรวมข้อมูลตามเวลาจริงทุก 10 วินาทีฉันจะได้รับอาการสะอึกทุกครั้งและวัตถุที่ฉันบันทึกด้วย saveObjectToSharedPreference จะสูญเสียการอ่านบางส่วน ยินดีต้อนรับทุกความคิด
Frank Zappa

เฮ้ @FrankZappa ยกโทษให้ฉันไม่สมบูรณ์การทำความเข้าใจปัญหาของคุณ แต่นี่คุณไปลองใช้แทนcommit applyมันอาจช่วยคุณได้
tpk

ขอบคุณ ให้ฉันพยายามอธิบาย แอพ Android ของฉันรวบรวมข้อมูลตามเวลาจริงโดยประมาณทุก 10 วินาที การรวบรวมข้อมูลนี้ไม่มีวัตถุใด ๆ เพียงแค่ตัวแปรและตรรกะระดับโลก จากนั้นข้อมูลจะถูกสรุปและเก็บไว้ในวัตถุ Java ฉันใช้วิธีการของคุณด้านบนเพื่อจัดเก็บและดึงวัตถุ Java ของฉันใน / ผ่าน SharedPreferences เพราะ a) ต่อความรู้ของฉันฉันไม่สามารถจัดเก็บวัตถุใน onSavedInstanceState และ b) เมื่อหน้าจอหมุนวัตถุของฉันถูกทำลายและสร้างใหม่ ดังนั้นฉันใช้ SharedPrefs ของคุณดังนั้นเมื่อหน้าจอหมุนวัตถุของฉันจะไม่สูญเสียคุณค่า (ต่อ .. )
Frank Zappa

ฉันวาง saveObjectToSharedPreferences รูทีนของคุณใน onSaveInstanceState ฉันวางรูทีน getSavedObjectFromPreference ของคุณใน onRestoreInstanceState อย่างไรก็ตามฉันทดสอบและยังได้รับการอัปเดตออบเจ็กต์ที่ไม่ได้รับหนึ่งชุดเนื่องจากการหมุนหน้าจอ ดังนั้นฉันควรย้ายสายไปที่ saveObjectToSharedPreferences ใกล้กับตรรกะจริงของฉันหรือไม่ ในที่สุดสิ่งที่วิธีการกระทำและนำไปใช้เกี่ยวข้องกับ?
Frank Zappa

1
@ 2943 วิธีแก้ปัญหาของคุณดูดีมาก แต่ถ้าฉันมีรายการเช่นList<CustomClass>ฉันควรทำอย่างไร getSavedObjectFromPreference(context, "mPreference", "mObjectKey", SampleClass.class)ไม่ยอมรับList<CustomClass>.class:(
Sharp Edge

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

เพื่อให้ได้ข้อมูลกลับมาฉันจะผ่านอะไรเป็น 'ตัวแปร' และ 'defaultValue'
Alex

ไม่เคยสร้างคลาสค่าคงที่ มันทำให้โค้ดของคุณเชื่อมโยงอย่างมากและกระจัดกระจายไปในเวลาเดียวกัน
Miha_x64

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 บน Android?
IgorGanapolsky

ข้อมูลเพิ่มเติมเกี่ยวกับการทำงานกับ 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

อีกวิธีหนึ่งในการบันทึกและกู้คืนออบเจ็กต์จากการแชร์หุ่นยนต์โดยไม่ต้องใช้รูปแบบ Json

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

คุณสามารถบันทึกอ็อบเจ็กต์ในการกำหนดค่าตามความชอบโดยไม่ต้องใช้ไลบรารีใด ๆ ก่อนอื่นคลาสอ็อบเจ็กต์ของคุณต้องนำไปใช้แบบ Serializable:

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

คุณสามารถหลีกเลี่ยงการเข้ารหัส Base64 และการหลบหนี XML โดยเพียงแค่เขียนไบต์เหล่านี้ลงในไฟล์แยกต่างหาก
Miha_x64

1

ขั้นตอนที่ 1:คัดลอกวางทั้งสองฟังก์ชั่นในไฟล์ java ของคุณ

 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 ของคุณเป็นสตริงในคลาส util ของคุณดังต่อไปนี้

 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 เพื่อเข้าถึง

เพิ่มการพึ่งพาต่อไปนี้ในไฟล์ build.gradel (Module: app) ภายใต้สคริปต์ Gradle:

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

ต่อไปนี้เป็นวิธีการใช้Kotlin Delegated Propertiesที่ฉันเลือกจากที่นี่แต่ขยายและอนุญาตให้มีกลไกอย่างง่ายสำหรับการตั้งค่าคุณสมบัติ SharedPreference

สำหรับString, Int, Long, FloatหรือBooleanจะใช้ SharePreference ทะเยอทะยานมาตรฐาน (s) และหมา (s) อย่างไรก็ตามสำหรับคลาสข้อมูลอื่น ๆ ทั้งหมดนั้นจะใช้ GSON เพื่อทำให้เป็นอนุกรมStringสำหรับ setter จากนั้น deserializes วัตถุข้อมูลสำหรับทะเยอทะยาน

เช่นเดียวกับโซลูชันอื่น ๆ สิ่งนี้ต้องการเพิ่ม GSON เป็นการอ้างอิงในไฟล์ gradle ของคุณ:

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)

สุดท้ายคุณสามารถอ่าน / เขียนค่าไปยัง SharedPreferences โดยใช้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

หากวัตถุของคุณซับซ้อนฉันขอแนะนำให้ Serialize / XML / JSON มันและบันทึกเนื้อหาเหล่านั้นลงในการ์ด SD คุณสามารถค้นหาข้อมูลเพิ่มเติมเกี่ยวกับวิธีบันทึกลงในที่จัดเก็บข้อมูลภายนอกได้ที่นี่: http://developer.android.com/guide/topics/data/data-storage.html#filesExternal


จะไม่ได้รับอนุญาตพิเศษ (การ์ด SD) ใช่ไหม
rishabh

ใช่มันจะตั้งแต่คุณเขียนไปยังการ์ด SD
trenpixster

1
จากประสบการณ์ของฉันสิทธิ์ที่น้อยกว่าที่ผู้ใช้ต้องการยิ่งดี การ์ด SD ควรเป็นตัวเลือกรองหากใช้ Gson ตามที่ระบุไว้ข้างต้นไม่ใช่ตัวเลือกที่ใช้งานได้
rishabh

ใช่ฉันเห็นด้วยเช่นกัน หากผลลัพธ์ของ JSON มีขนาดใหญ่พอการ์ด SD ควรเป็นตัวเลือก มันเป็นการแลกเปลี่ยนที่ฉันจะพูด
trenpixster

0

มีสองไฟล์ที่แก้ไขปัญหาทั้งหมดของคุณเกี่ยวกับsharedpreferences

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

-remove

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

รับคำ

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

0

จัดเก็บข้อมูลใน SharedPreference

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

0

ชั้น utils ของฉันสำหรับรายการบันทึกไป 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);

.
รหัสเต็มของ utils ของฉัน // ตรวจสอบโดยใช้ตัวอย่างในรหัสกิจกรรม


0

ฉันใช้แจ็คสันเพื่อเก็บสิ่งของของฉัน ( แจ็คสัน )

เพิ่มห้องสมุดแจ็คสันเพื่อ gradle:

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
}

วัตถุ Java กับ 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.