Cách Android SharedPreferences lưu / lưu trữ đối tượng


214

Chúng ta cần lấy các đối tượng người dùng ở nhiều nơi, trong đó có nhiều trường. Sau khi đăng nhập, tôi muốn lưu / lưu trữ các đối tượng người dùng này. Làm thế nào chúng ta có thể thực hiện loại kịch bản này?

Tôi không thể lưu trữ nó như thế này:

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

loại dữ liệu bạn muốn lưu trữ?
ilango j


Ý của bạn là gì ~ " và đối tượng điều hành "? Vui lòng kiểm tra ngữ pháp của bạn trước khi đăng lên StackOverflow.
IgorGanapolsky

Bạn có thể sử dụng thư viện này có nhiều tính năng ... github.com/moinkhan-in/PreferenceSpider
Moinkhan

Câu trả lời:


547

Bạn có thể sử dụng gson.jar để lưu trữ các đối tượng lớp vào SharedPreferences . Bạn có thể tải xuống bình này từ google-gson

Hoặc thêm phụ thuộc GSON vào tệp Gradle của bạn:

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

Tạo một sở thích chung:

SharedPreferences  mPrefs = getPreferences(MODE_PRIVATE);

Để tiết kiệm:

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

Lấy:

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

9
Cảm ơn bạn! Nhưng bạn không chính xác trong phần Lưu (dòng 3), mã chính xác là: String json = gson.toJson (myObject);
Caesarferreira

Bạn có cần cả 3 lọ không? Có 3 trong số đó trong liên kết đó. . .
coolcool1994

3
URL chính xác cho tải về jar là: search.maven.org/...
Shajeel Afzal

2
Điều này có vấn đề với tham chiếu vòng tròn dẫn đến StackOverFlowException xD Đọc thêm tại đây stackoverflow.com/questions/10209959/iêu
phuwin

1
@rozina có Gson thì tốt hơn. Trước hết để sử dụng tuần tự hóa, đối tượng và mọi đối tượng bên trong nó cần thực hiện giao diện tuần tự hóa. Điều này là không cần thiết cho gson. gson cũng hoạt động tuyệt vời khi đối tượng của bạn là một danh sách các đối tượng.
Neville Nazerane

36

Để thêm vào câu trả lời của @ MuhammadAamirALi's, bạn có thể sử dụng Gson để lưu và truy xuất danh sách các đối tượng

Lưu danh sách các đối tượng do người dùng định nghĩa vào 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();

Nhận danh sách các đối tượng do người dùng định nghĩa từ 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
"Loại" ở đó là gì? (trong danh sách Nhận, dòng thứ 2).
băng đảng

15

Tôi biết chủ đề này là một chút cũ. Nhưng dù sao tôi cũng sẽ đăng bài này với hy vọng nó có thể giúp được ai đó. Chúng ta có thể lưu trữ các trường của bất kỳ Đối tượng nào theo sở thích được chia sẻ bằng cách tuần tự hóa đối tượng thành Chuỗi. Ở đây tôi đã sử dụng GSONđể lưu trữ bất kỳ đối tượng để ưu tiên chia sẻ.

Lưu đối tượng để ưu tiên:

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

Lấy đối tượng từ ưu tiên:

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

Ghi chú :

Hãy nhớ để thêm compile 'com.google.code.gson:gson:2.6.2'vào dependenciestrong lớp của bạn.

Ví dụ :

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

Cập nhật:

Như @Sharp_Edge đã chỉ ra trong các bình luận, giải pháp trên không hoạt động List.

Một sửa đổi nhỏ cho chữ ký của getSavedObjectFromPreference()- từ Class<GenericClass> classTypeđến Type classTypesẽ làm cho giải pháp này được khái quát hóa. Chữ ký chức năng đã sửa đổi,

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

Để gọi,

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

Chúc mừng mã hóa!


1
Điều này thực sự hữu ích cảm ơn. Đối với bất kỳ ai ở đây quan tâm đến nhận xét ... tôi có nên thực hiện cuộc gọi tới saveObjectToSharedPreference trong onSaveInstanceState không? Bây giờ tôi đã có nó trên onSaveInstanceState nhưng, do ứng dụng của tôi đang thu thập dữ liệu thời gian thực cứ sau 10 giây, tôi lại bị một tiếng nấc và đối tượng tôi đang lưu với saveObjectToSharedPreference mất một số bài đọc. Mọi suy nghĩ đều được chào đón.
Frank Zappa

này @FrankZappa, tha thứ cho tôi không hoàn toàn hiểu vấn đề của bạn nhưng ở đây bạn đi, hãy thử sử dụng committhay vì apply. Nó có thể giúp bạn.
tpk

cảm ơn. Hãy để tôi cố gắng giải thích. Ứng dụng Android của tôi thu thập dữ liệu theo thời gian thực khoảng 10 giây một lần. Bộ sưu tập dữ liệu này không sử dụng các đối tượng, chỉ các biến toàn cục và logic. Tiếp theo, dữ liệu sau đó được tóm tắt và lưu trữ trong một đối tượng Java. Tôi sử dụng phương thức của bạn ở trên để lưu trữ và truy xuất đối tượng Java của tôi trong / thông qua SharedPreferences vì ​​a) theo hiểu biết của tôi Tôi không thể lưu trữ các đối tượng trong onSattedInstanceState và b) khi màn hình xoay đối tượng của tôi bị phá hủy và được tạo lại. Do đó, tôi đang sử dụng phương pháp SharedPrefs của bạn để khi màn hình được xoay, đối tượng của tôi không mất giá trị. (tiếp tục ..)
Frank Zappa

Tôi đã đặt thói quen saveObjectToSharedPreferences của bạn trong onSaveInstanceState. Tôi đã đặt thói quen getSattedObjectFromPreference của bạn trong onRestoreInstanceState. Tuy nhiên, tôi đã thử nghiệm và vẫn nhận được một bộ cập nhật đối tượng bị bỏ lỡ do xoay màn hình. Do đó, tôi có nên chuyển cuộc gọi đến saveObjectToSharedPreferences gần hơn với logic thực tế của mình không? Cuối cùng, phương pháp nào cam kết và áp dụng liên quan đến?
Frank Zappa

1
@ 2943 Giải pháp của bạn trông rất tuyệt, nhưng nếu tôi có danh sách chẳng hạn List<CustomClass>thì tôi nên làm thế nào? getSavedObjectFromPreference(context, "mPreference", "mObjectKey", SampleClass.class)không chấp nhận List<CustomClass>.class:(
Sharp Edge

6

Tốt hơn là tạo một Constantslớp toàn cầu để lưu khóa hoặc biến để tìm nạp hoặc lưu dữ liệu.

Để lưu dữ liệu, hãy gọi phương thức này để lưu dữ liệu từ mọi nơi.

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

Sử dụng nó để có được dữ liệu.

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

và một phương pháp như thế này sẽ thực hiện được mẹo

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

Để lấy lại dữ liệu, tôi phải chuyển cái gì là 'biến' và 'defaultValue'?
Alex

Không bao giờ tạo một lớp Hằng. Nó làm cho mã của bạn được ghép nối cao và phân tán cùng một lúc.
Miha_x64

5

Hãy thử cách tốt nhất này:

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

}

Viết giá trị:

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

Và nhận giá trị bằng cách sử dụng:

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

2
Điều này có liên quan gì đến việc lưu một đối tượng trong SharedPreferences trên Android?
IgorGanapolsky

Thông tin thêm về cách làm việc với Sharedpreferences có thể được tìm thấy tại stackoverflow.com/a/2614771/1815624 lưu ý bạn có thể muốn sử dụng return PreferenceManager.getDefaultSharedPreferences(context);thay vìreturn context.getSharedPreferences(PREF_NAME, MODE);
CrandellWS

3

Bạn đã không nói những gì bạn làm với prefsEditorđối tượng sau này, nhưng để duy trì dữ liệu ưu tiên, bạn cũng cần sử dụng:

prefsEditor.commit();

2

Xem ở đây, điều này có thể giúp bạn:

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
Bạn có thể giải thích mã nhiều hơn một chút vì hiện tại nó chỉ đại diện cho "một bó mã".
Werner

1

Một cách khác để lưu và khôi phục một đối tượng từ các cuộc chia sẻ của Android mà không cần sử dụng định dạng 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

Bạn có thể lưu đối tượng trong các tùy chọn mà không cần sử dụng bất kỳ thư viện nào, trước hết lớp đối tượng của bạn phải triển khai Nối tiếp:

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

}

Sau đó, bạn có thể dễ dàng sử dụng hai phương thức này để chuyển đổi đối tượng thành chuỗi và chuỗi thành đối tượng:

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

Để tiết kiệm:

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

Đọc

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

Bạn có thể tránh mã hóa Base64 và thoát XML bằng cách chỉ ghi các byte này vào một tệp riêng biệt.
Miha_x64

1

Bước 1: Sao chép dán hai chức năng này trong tệp java của bạn.

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

Bước 2: để tiết kiệm sử dụng:

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

để lấy lại sử dụng:

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

Bạn có thể đặt các tùy chọn chia sẻ khác nhau bằng cách sử dụng các tên khóa khác nhau như:

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

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

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

1

Nếu bạn muốn lưu trữ toàn bộ Đối tượng mà bạn nhận được phản hồi, Nó có thể đạt được bằng cách thực hiện một cái gì đó như,

Đầu tiên Tạo một phương thức chuyển đổi JSON của bạn thành một chuỗi trong lớp tiện dụng của bạn như dưới đây.

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

Sau đó, trong lớp tùy chọn chia sẻ Làm một cái gì đó như,

 public void storeLoginResponse(yourResponseClass objName) {

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

và sau đó tạo một phương thức cho 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();
    }
}

Sau đó, chỉ cần gọi phương thức đầu tiên khi bạn nhận được phản hồi và thứ hai khi bạn cần nhận dữ liệu từ các tùy chọn chia sẻ như

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

đó là tất cả.

Hy vọng nó sẽ giúp bạn.

Happy Coding();


1

Tôi gặp sự cố khi sử dụng câu trả lời được chấp nhận để truy cập dữ liệu Tùy chọn chia sẻ qua các hoạt động. Trong các bước này, bạn đặt tên cho getSharedPreferences để truy cập nó.

Thêm phần phụ thuộc sau vào tệp build.gradel (Mô-đun: ứng dụng) trong Tập lệnh Gradle:

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

Để lưu:

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

Để truy xuất một hoạt động khác:

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'

hy vọng điều này sẽ giúp bạn :)


1

Đây là một cách sử dụng Thuộc tính được ủy quyền của Kotlin mà tôi đã chọn từ đây , nhưng đã mở rộng và cho phép một cơ chế đơn giản để nhận / thiết lập các thuộc tính SharedPreference.

Đối với String, Int, Long, Floathay Boolean, nó sử dụng các getter chuẩn SharePreference (s) và setter (s). Tuy nhiên, đối với tất cả các lớp dữ liệu khác, nó sử dụng GSON để tuần tự hóa thành a String, cho trình thiết lập. Sau đó giải tuần tự hóa cho đối tượng dữ liệu, cho getter.

Tương tự như các giải pháp khác, điều này đòi hỏi phải thêm GSON làm phụ thuộc trong tệp lớp của bạn:

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

Đây là một ví dụ về một lớp dữ liệu đơn giản mà chúng tôi muốn có thể lưu và lưu trữ vào SharedPreferences:

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

Đây là một lớp thực hiện các đại biểu tài sản:

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

Lưu ý: bạn không cần cập nhật bất cứ điều gì trong sealed class. Các tính chất phân cấp là Object / Singletons UserPreferenceProperty, NullableUserPreferencePropertyFirstTimeUser.

Để thiết lập một đối tượng dữ liệu mới để lưu / nhận từ SharedPreferences, giờ đây thật dễ dàng như thêm bốn dòng:

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

Cuối cùng, bạn có thể đọc / ghi giá trị vào SharedPreferences chỉ bằng cách sử dụng bytừ khóa:

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

Nếu đối tượng của bạn phức tạp, tôi khuyên bạn nên nối tiếp / XML / JSON nó và lưu các nội dung đó vào thẻ SD. Bạn có thể tìm thêm thông tin về cách lưu vào bộ nhớ ngoài tại đây: http://developer.android.com/guide/topics/data/data-st Storage.html # filesExternal


Bạn không cần phải có sự cho phép thêm (Thẻ SD)?
rishabh

Có, vì bạn sẽ ghi vào thẻ SD.
trenpixster

1
Từ kinh nghiệm của tôi, càng ít quyền yêu cầu cho người dùng thì càng tốt. Thẻ SD phải là lựa chọn thứ cấp, nếu sử dụng Gson như đã nêu ở trên không phải là một lựa chọn khả thi.
rishabh

Yup, tôi cũng đồng ý với điều đó; Chỉ khi kết quả JSON đủ lớn thì thẻ SD mới là một tùy chọn. Đó là một sự đánh đổi mà tôi muốn nói.
trenpixster

0

Có hai tệp đã giải quyết tất cả vấn đề của bạn về 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);
    }
}

bây giờ bạn có thể lưu, xóa hoặc nhận like,

-tiết kiệm

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

-tẩy

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

-được

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

0

Lưu trữ dữ liệu trong SharedPreference

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

0

Lớp utils của tôi để lưu danh sách vào 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);
    }
}

Sử dụng

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

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

.
Mã đầy đủ các tiện ích của tôi // kiểm tra bằng ví dụ trong Mã hoạt động


0

Tôi đã sử dụng jackson để lưu trữ các đối tượng của mình ( jackson ).

Đã thêm thư viện jackson vào lớp:

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'

Lớp kiểm tra của tôi:

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

Đối tượng Java thành JSON:

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

Lưu trữ nó trong các tùy chọn chia sẻ:

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

Khôi phục nó từ các tùy chọn chia sẻ:

ObjectMapper objectMapper = new ObjectMapper();
Car car = objectMapper.readValue(preferences.car().get(), Car.class);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.