Bagaimana Android SharedPreferences menyimpan / menyimpan objek


217

Kita perlu mendapatkan objek pengguna di banyak tempat, yang berisi banyak bidang. Setelah masuk, saya ingin menyimpan / menyimpan objek pengguna ini. Bagaimana kita bisa menerapkan skenario semacam ini?

Saya tidak bisa menyimpannya seperti ini:

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

tipe data apa yang ingin Anda simpan?
ilango j


Apa yang Anda maksud dengan ~ " dan Object eksekutif "? Silakan periksa tata bahasa Anda sebelum memposting di StackOverflow.
IgorGanapolsky

Anda dapat menggunakan perpustakaan ini yang memiliki banyak fitur ... github.com/moinkhan-in/PreferenceSpider
Moinkhan

Jawaban:


549

Anda dapat menggunakan gson.jar untuk menyimpan objek kelas ke dalam SharedPreferences . Anda dapat mengunduh toples ini dari google-gson

Atau tambahkan ketergantungan GSON dalam file Gradle Anda:

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

Membuat preferensi bersama:

SharedPreferences  mPrefs = getPreferences(MODE_PRIVATE);

Untuk menyimpan:

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

Mendapatkan kembali:

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

9
Terima kasih teman! Tetapi Anda salah dalam bagian Simpan (baris 3), kode yang benar adalah: String json = gson.toJson (myObject);
cesarferreira

Apakah Anda membutuhkan 3 toples? Ada 3 dari mereka di tautan itu. . .
coolcool1994

3
URL yang benar untuk mengunduh toples adalah: search.maven.org/…
Shajeel Afzal

2
Ini memiliki masalah dengan referensi melingkar yang mengarah ke StackOverFlowException xD Baca lebih lanjut di sini stackoverflow.com/questions/10209959/...
phuwin

1
@rozina ya Gson lebih baik. Pertama-tama untuk menggunakan serialize, objek dan setiap objek di dalamnya perlu mengimplementasikan antarmuka serialisasi. Ini tidak diperlukan untuk gson. gson juga berfungsi dengan baik ketika objek Anda adalah daftar objek.
Neville Nazerane

36

Untuk menambahkan jawaban @ MuhammadAamirALi, Anda dapat menggunakan Gson untuk menyimpan dan mengambil daftar objek

Simpan Daftar objek yang ditentukan pengguna ke 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();

Dapatkan Daftar objek yang ditentukan pengguna dari 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
Apa itu "Ketik" di sana? (di Dapatkan daftar, baris ke-2).
gangadhars

15

Saya tahu utas ini agak tua. Tapi saya akan memposting ini dengan harapan bisa membantu seseorang. Kami dapat menyimpan bidang Objek apa pun untuk preferensi bersama dengan membuat serialisasi objek ke String. Di sini saya telah digunakan GSONuntuk menyimpan objek apa pun untuk preferensi bersama.

Simpan Objek ke Preferensi:

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

Ambil Objek dari Preferensi:

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

Catatan :

Ingat untuk menambahkan compile 'com.google.code.gson:gson:2.6.2'ke dependenciesdalam Gradle Anda.

Contoh :

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

Memperbarui:

Seperti @Sharp_Edge tunjukkan dalam komentar, solusi di atas tidak bekerja List.

Sedikit modifikasi pada tanda tangan getSavedObjectFromPreference()- dari Class<GenericClass> classTypeke Type classTypeakan membuat solusi ini digeneralisasi. Tanda tangan fungsi yang dimodifikasi,

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

Untuk memohon,

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

Selamat Coding!


1
ini sangat membantu, terima kasih. Bagi siapa pun di sini yang mau berkomentar ... haruskah saya menelepon saveObjectToSharedPreference di onSaveInstanceState? Saya memilikinya di onSaveInstanceState sekarang tetapi, mengingat aplikasi saya mengumpulkan data real-time setiap 10 detik, saya mendapatkan cegukan sesekali dan objek yang saya simpan dengan saveObjectToSharedPreference kehilangan beberapa bacaan. Semua pikiran diterima.
Frank Zappa

hei @ FrankZappa, maafkan saya tidak sepenuhnya memahami masalah Anda, tetapi di sini Anda pergi, coba gunakan commitbukan apply. Mungkin membantu Anda.
tpk

Terima kasih. Biarkan saya coba jelaskan. Aplikasi Android saya mengumpulkan data dalam waktu nyata kira-kira setiap 10 detik. Pengumpulan data ini tidak menggunakan objek, hanya variabel global dan logika. Selanjutnya data tersebut kemudian dirangkum dan disimpan dalam objek Java. Saya menggunakan metode Anda di atas untuk menyimpan dan mengambil objek Java saya di / melalui SharedPreferences karena a) setahu saya, saya tidak bisa menyimpan objek di onSavedInstanceState dan b) ketika layar memutar objek saya dihancurkan dan dibuat kembali. Oleh karena itu, saya menggunakan pendekatan SharedPrefs Anda sehingga ketika layar diputar objek saya tidak kehilangan nilainya. (lanjt ..)
Frank Zappa

Saya menempatkan rutin saveObjectToSharedPreferences Anda di onSaveInstanceState. Saya menempatkan rutinitas getSavedObjectFromPreference Anda di onRestoreInstanceState. Namun, saya menguji dan masih mendapat satu set pembaruan objek yang tidak terjawab karena rotasi layar. Karena itu, haruskah saya memindahkan panggilan ke saveObjectToSharedPreferences lebih dekat ke logika saya yang sebenarnya? Terakhir metode apa yang dilakukan dan diterapkan berkaitan?
Frank Zappa

1
@ 2943 Solusi Anda tampak hebat, tetapi jika saya memiliki daftar misalnya List<CustomClass>bagaimana saya harus melakukannya? getSavedObjectFromPreference(context, "mPreference", "mObjectKey", SampleClass.class)tidak menerima List<CustomClass>.class:(
Sharp Edge

6

Lebih baik adalah Membuat Constantskelas global untuk menyimpan kunci atau variabel untuk mengambil atau menyimpan data.

Untuk menyimpan data, panggil metode ini untuk menyimpan data dari mana saja.

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

Gunakan itu untuk mendapatkan data.

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

dan metode seperti ini akan melakukan triknya

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

Untuk mendapatkan kembali data, apa yang harus saya sampaikan sebagai 'variabel' dan 'defaultValue'?
Alex

Tidak pernah membuat kelas Konstanta. Itu membuat kode Anda sangat digabungkan dan tersebar pada saat yang sama.
Miha_x64

5

Coba cara terbaik ini:

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

}

Tulis Nilai:

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

Dan Dapatkan nilai menggunakan:

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

2
Apa hubungannya ini dengan menyimpan objek di SharedPreferences di Android?
IgorGanapolsky

Info lebih lanjut tentang bekerja dengan Sharedpreferences dapat ditemukan di stackoverflow.com/a/2614771/1815624 catatan Anda mungkin ingin menggunakan return PreferenceManager.getDefaultSharedPreferences(context);bukanreturn context.getSharedPreferences(PREF_NAME, MODE);
CrandellWS

3

Anda belum menyatakan apa yang Anda lakukan dengan prefsEditorobjek setelah ini, tetapi untuk mempertahankan data preferensi, Anda juga perlu menggunakan:

prefsEditor.commit();

2

Lihat di sini, ini dapat membantu Anda:

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
Bisakah Anda menjelaskan kode sedikit lebih karena ini saat ini hanya mewakili "banyak kode".
Werner

1

Cara lain untuk menyimpan dan mengembalikan objek dari preferensi bersama android tanpa menggunakan format 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

Anda dapat menyimpan objek dalam preferensi tanpa menggunakan pustaka apa pun, pertama-tama kelas objek Anda harus mengimplementasikan 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;
}

}

Kemudian Anda dapat dengan mudah menggunakan dua metode ini untuk mengkonversi objek ke string dan string ke objek:

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

Untuk menyimpan:

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

Untuk membaca

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

Anda dapat menghindari penyandian Base64 dan XML dengan hanya menulis byte-byte ini ke dalam file terpisah.
Miha_x64

1

Langkah 1: Salin tempel kedua fungsi ini di file java Anda.

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

Langkah 2: untuk menghemat penggunaan:

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

untuk mengambil penggunaan:

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

Anda dapat mengatur preferensi bersama yang berbeda dengan menggunakan nama kunci yang berbeda seperti:

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

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

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

1

Jika Anda ingin menyimpan seluruh objek yang Anda dapatkan sebagai respons, itu dapat dicapai dengan melakukan sesuatu seperti,

Pertama, buat metode yang mengubah JSON Anda menjadi string di kelas util Anda seperti di bawah ini.

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

Kemudian Di Kelas Preferensi Bersama Lakukan sesuatu seperti,

 public void storeLoginResponse(yourResponseClass objName) {

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

dan kemudian buat metode untuk 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();
    }
}

Kemudian panggil saja metode Pertama ketika Anda mendapatkan respons dan kedua ketika Anda perlu mendapatkan data dari preferensi berbagi seperti

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

itu saja.

Semoga ini bisa membantu Anda.

Happy Coding();


1

Saya mengalami masalah dalam menggunakan jawaban yang diterima untuk mengakses data Preferensi Bersama di seluruh kegiatan. Dalam langkah-langkah ini, Anda memberi getSharedPreferences nama untuk mengaksesnya.

Tambahkan dependensi berikut dalam file build.gradel (Module: app) di bawah Gradle Scripts:

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

Untuk Menyimpan:

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

Untuk Mengambil dalam Aktivitas yang Berbeda:

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'

Semoga ini bisa membantu Anda :)


1

Berikut ini adalah cara menggunakan Properti Delegasi Kotlin yang saya ambil dari sini , tetapi diperluas dan memungkinkan mekanisme sederhana untuk mendapatkan / mengatur properti SharedPreference.

Untuk String, Int, Long, Floatatau Boolean, menggunakan standar SharePreference getter (s) dan setter (s). Namun, untuk semua kelas data lainnya, ia menggunakan GSON untuk membuat serial ke a String, untuk setter. Kemudian deserializes ke objek data, untuk pengambil.

Mirip dengan solusi lain, ini membutuhkan penambahan GSON sebagai ketergantungan pada file gradle Anda:

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

Berikut adalah contoh kelas data sederhana yang ingin kami simpan dan simpan ke SharedPreferences:

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

Ini adalah satu kelas yang mengimplementasikan delegasi properti:

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

Catatan: Anda tidak perlu memperbarui apa pun di sealed class. Properti yang didelegasikan adalah Obyek / Lajang UserPreferenceProperty, NullableUserPreferencePropertydan FirstTimeUser.

Untuk menyiapkan objek data baru untuk disimpan / didapatkan dari SharedPreferences, sekarang semudah menambahkan empat baris:

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

Akhirnya, Anda dapat membaca / menulis nilai ke SharedPreferences dengan hanya menggunakan bykata kunci:

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

Jika Objek Anda kompleks, saya sarankan untuk Serialize / XML / JSON dan simpan konten tersebut ke kartu SD. Anda dapat menemukan info tambahan tentang cara menyimpan ke penyimpanan eksternal di sini: http://developer.android.com/guide/topics/data/data-storage.html#filesExternal


Bukankah itu memerlukan izin tambahan (Kartu SD)?
rishabh

Ya itu karena Anda akan menulis ke kartu SD.
trenpixster

1
Dari pengalaman saya, semakin sedikit izin yang diperlukan untuk pengguna, semakin baik. Kartu SD harus menjadi pilihan kedua, jika menggunakan Gson seperti yang disebutkan di atas bukan pilihan yang layak untuk digunakan.
rishabh

Yup, saya juga setuju dengan itu; Hanya jika hasil JSON cukup besar seharusnya kartu SD menjadi pilihan. Ini adalah trade-off yang akan saya katakan.
trenpixster

0

ada dua file yang memecahkan semua masalah Anda tentang preferensipenggunaan bersama

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

sekarang Anda dapat menyimpan, menghapus, atau mendapatkan seperti,

-menyimpan

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

-menghapus

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

-Dapatkan

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

0

Simpan data dalam SharedPreference

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

0

Kelas utilitas saya untuk menyimpan daftar 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);
    }
}

Menggunakan

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

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

.
Kode lengkap utils saya // periksa menggunakan contoh dalam kode Kegiatan


0

Saya telah menggunakan jackson untuk menyimpan objek saya ( jackson ).

Menambahkan perpustakaan jackson ke 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'

Kelas ujian saya:

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

Objek Java ke JSON:

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

Simpan dalam preferensi bersama:

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

Pulihkan dari preferensi bersama:

ObjectMapper objectMapper = new ObjectMapper();
Car car = objectMapper.readValue(preferences.car().get(), Car.class);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.