Android SharedPreferences nesneyi nasıl kaydeder / saklar?


216

Birçok alan içeren birçok yerde kullanıcı nesneleri almamız gerekiyor. Giriş yaptıktan sonra bu kullanıcı nesnelerini kaydetmek / saklamak istiyorum. Bu tür bir senaryoyu nasıl uygulayabiliriz?

Böyle saklayamıyorum:

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

hangi tür verileri saklamak istiyorsunuz?
ilango j


~ " Ve yönetici Object " ile ne demek istediniz ? Lütfen StackOverflow'da yayınlamadan önce dilbilginizi kontrol edin.
IgorGanapolsky

Birçok özelliğe sahip bu kütüphaneyi kullanabilirsiniz ... github.com/moinkhan-in/PreferenceSpider
Moinkhan

Yanıtlar:


548

Gson.jar dosyasını sınıf nesnelerini SharedPreferences içinde saklamak için kullanabilirsiniz . Bu kavanozu google-gson'dan indirebilirsiniz

Veya Gradle dosyanıza GSON bağımlılığını ekleyin:

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

Paylaşılan bir tercih oluşturma:

SharedPreferences  mPrefs = getPreferences(MODE_PRIVATE);

Kaydetmek:

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

Almak için:

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

9
Teşekkürler arkadaşım! Ancak Kaydet bölümünde (satır 3) yanlış, doğru kod: String json = gson.toJson (myObject);
cesarferreira

3 kavanozun hepsine mi ihtiyacınız var? Bu bağlantıda 3 tane var. . .
coolcool1994

3
Kavanozu indirmek için doğru URL: search.maven.org/…
Shajeel Afzal

2
Bu StackOverFlowException xD yol açar dairesel başvuru ile ilgili bir sorun var Daha fazla bilgi burada stackoverflow.com/questions/10209959/…
phuwin

1
@rozina evet Gson daha iyi. Her şeyden önce serialize kullanmak için, nesne ve içindeki her nesne serialize arabirimini uygulamalıdır. Bu gson için gerekli değildir. gson, nesneniz bir nesne listesi olduğunda da harika çalışır.
Neville Nazerane

36

@ MuhammadAamirALi'nin cevabına eklemek için, bir nesne listesini kaydetmek ve almak için Gson'u kullanabilirsiniz.

Kullanıcı tanımlı nesnelerin Listesini Paylaşılan Tercihlere Kaydet

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'dan kullanıcı tanımlı nesnelerin listesini alma

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
Orada "Tip" nedir? (Al listesinde 2. satır).
gangadhar

15

Bu konu biraz eski biliyorum. Ama yine de bunu birisine yardım edebileceğini umarak yayınlayacağım. Nesneyi Dizeye serileştirerek herhangi bir Nesnenin alanlarını paylaşılan tercihe göre depolayabiliriz . Burada GSONherhangi bir nesneyi paylaşılan tercihe saklamak için kullandım .

Nesneyi Tercihe Kaydet:

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

Nesneyi Tercihten Al:

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

Not :

Eklemeyi unutmayın compile 'com.google.code.gson:gson:2.6.2'için dependenciessizin gradle içinde.

Örnek :

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

Güncelleme:

@Sharp_Edge yorumlarda belirtildiği gibi, yukarıdaki çözüm işe yaramaz List.

İmza için hafif bir modifikasyon getSavedObjectFromPreference()- dan Class<GenericClass> classTypeTo Type classTypegenelleştirilmiş bu çözümü yapacaktır. Değiştirilmiş fonksiyon imzası,

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

Çağırmak için,

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

Mutlu Kodlama!


1
Bu gerçekten yardımcı oldu teşekkürler. Burada yorum yapmak umurunda kimse için ... onSaveInstanceState saveObjectToSharedPreference çağrısı koymak gerekir? Şimdi onSaveInstanceState var ama benim app 10 saniyede bir gerçek zamanlı veri toplama göz önüne alındığında, arada bir hıçkırık olsun ve saveObjectToSharedPreference ile kaydettiğim nesne bazı okumaları kaybeder. Tüm düşünceler açıktır.
Frank Zappa

hey @FrankZappa, sorununu tam olarak anlamamam için beni affet ama işte gidiyorsun commityerine kullanmayı dene apply. Size yardımcı olabilir.
tpk

Teşekkürler. Anlatmaya çalışayım. Android uygulamam yaklaşık 10 saniyede bir gerçek zamanlı veri toplar. Bu veri toplama hiçbir nesne kullanmaz, sadece global değişkenler ve mantık kullanır. Daha sonra veriler özetlenir ve bir Java nesnesinde saklanır. Java yöntemimi SharedPreferences içinde / aracılığıyla saklamak ve almak için yukarıdaki yönteminizi kullanıyorum, çünkü a) bildiklerimi onSavedInstanceState ve b) 'de nesneleri döndürdüğümde ekran nesnem yok edildiğinde ve yeniden oluşturulduğunda. Bu nedenle, ekran döndürüldüğünde nesnem değerlerini kaybetmez, bu yüzden SharedPrefs yaklaşımınızı kullanıyorum. (devam ..)
Frank Zappa

SaveObjectToSharedPreferences yordamınızı onSaveInstanceState içine yerleştirdim. GetSavedObjectFromPreference yordamınızı onRestoreInstanceState'e yerleştirdim. Ancak, ekran döndürme nedeniyle bir dizi cevapsız nesne güncellemesi test ettim ve hala aldım. Bu nedenle, saveObjectToSharedPreferences çağrısını gerçek mantığımın yakınına taşımalıyım? Son olarak, taahhüt ve uygulama hangi yöntemle ilgilidir?
Frank Zappa

1
@ 2943 Çözüm harika görünüyor, ancak örneğin bir listem varsa bunu List<CustomClass>nasıl yapmalıyım? getSavedObjectFromPreference(context, "mPreference", "mObjectKey", SampleClass.class)kabul etmiyor List<CustomClass>.class:(
Sharp Edge

6

Daha iyisi, Constantsverileri almak veya kaydetmek için anahtar veya değişkenleri kaydetmek için global bir sınıf yapmaktır.

Verileri kaydetmek için her yerden verileri kaydetmek için bu yöntemi kullanın.

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

Veri almak için kullanın.

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

ve böyle bir yöntem hile yapacak

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

Verileri geri almak için 'değişken' ve 'varsayılanDeğer' olarak ne iletirim?
Alex

Asla bir Sabitler sınıfı oluşturmayın. Kodunuzu aynı anda yüksek oranda bağlı ve dağınık hale getirir.
Miha_x64

5

Bu en iyi yolu deneyin:

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

}

Değeri Yazın:

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

Ve kullanarak değer alın:

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

2
Bunun Android'de SharedPreferences'a bir nesne kaydetmeyle ne ilgisi var?
IgorGanapolsky

Sharedpreferences ile çalışma hakkında daha fazla bilgi stackoverflow.com/a/2614771/1815624 adresinde bulunabilirreturn PreferenceManager.getDefaultSharedPreferences(context);return context.getSharedPreferences(PREF_NAME, MODE);
CrandellWS

3

Bundan prefsEditorsonra nesne ile ne yaptığınızı belirtmediniz , ancak tercih verilerini devam ettirmek için şunları kullanmanız gerekir:

prefsEditor.commit();

2

Buraya bakın, bu size yardımcı olabilir:

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
Şu anda sadece bir grup kodu temsil ettiği için kodu biraz daha açıklayabilir misiniz?
Werner

1

Json formatını kullanmadan android paylaşılan tercihlerden bir nesneyi kaydetmenin ve geri yüklemenin başka bir yolu

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

Nesneyi herhangi bir kitaplık kullanmadan tercihlerde kaydedebilirsiniz, öncelikle nesne sınıfınızın Serializable'ı uygulaması gerekir:

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

}

Ardından, nesneyi dizeye ve dizeyi nesneye dönüştürmek için bu iki yöntemi kolayca kullanabilirsiniz:

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

Kaydetmek:

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

Okumak

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

Bu baytları ayrı bir dosyaya yazarak Base64 kodlaması ve XML çıkışından kaçınabilirsiniz.
Miha_x64

1

Adım 1: Bu iki işlevi java dosyanıza kopyalayı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);
    }

2.Adım: Kullanımı kaydetmek için:

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

kullanımı almak için:

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

Aşağıdakiler gibi farklı anahtar adlarını kullanarak farklı paylaşılan tercihler ayarlayabilirsiniz:

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

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

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

1

Yanıt aldığınız tüm Nesneyi saklamak istiyorsanız, gibi bir şey yaparak başarabilir,

Önce JSON'unuzu aşağıdaki gibi util sınıfınızda bir dizeye dönüştüren bir yöntem oluşturun.

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

Sonra Paylaşılan Tercihler Sınıfında

 public void storeLoginResponse(yourResponseClass objName) {

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

ve sonra getPreferences için bir yöntem oluşturun

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

Ardından yanıt aldığınızda İlk yöntemi, ikinci gibi paylaşım tercihlerinden veri almanız gerektiğinde ikinci yöntemi çağırın

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

bu kadar.

Umarım size yardımcı olur.

Happy Coding();


1

Etkinlikler arasında Paylaşılan Tercih verilerine erişmek için kabul edilen yanıtı kullanmada sorun yaşadım. Bu adımlarda, getSharedPreferences'a erişmek için bir ad verirsiniz.

Gradle Scripts altındaki build.gradel (Module: app) dosyasına aşağıdaki bağımlılığı ekleyin:

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

Kaydetmek:

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

Farklı Bir Etkinlikte Geri Alma:

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'

Umarım bu sana yardımcı olur :)


1

İşte buradan aldığım , ancak genişlettiğim ve SharedPreference özelliklerini almak / ayarlamak için basit bir mekanizmaya izin veren Kotlin Temsilcisi Özellikleri'ni kullanmak .

İçin String, Int, Long, Floatya da Boolean, standart SharePreference getter (lar) ve ayarlayıcı (ler) kullanır. Ancak, diğer tüm veri sınıfları Stringiçin, ayarlayıcı için bir , a serileştirmek üzere GSON kullanır . Daha sonra alıcı için veri nesnesinin serisini kaldırır.

Diğer çözümlere benzer şekilde, gradle dosyanızda bir bağımlılık olarak GSON eklemeniz gerekir:

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

Aşağıda, SharedPreferences'a kaydedip depolamak isteyebileceğimiz basit bir veri sınıfı örneği verilmiştir:

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

Özellik delegelerini uygulayan bir sınıf:

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

Not: içindeki hiçbir şeyi güncellemenize gerek yoktur sealed class. Yetkilendirilen özellikler Nesne / Singletons vardır UserPreferenceProperty, NullableUserPreferencePropertyve FirstTimeUser.

SharedPreferences'ı kaydetmek / almak için yeni bir veri nesnesi ayarlamak için, şimdi dört satır eklemek kadar kolay:

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

Son olarak, sadece byanahtar kelimeyi kullanarak SharedPreferences'a değer okuyabilir / yazabilirsiniz :

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

Nesneniz karmaşıksa, Serialize / XML / JSON kullanmanızı ve bu içerikleri SD karta kaydetmenizi öneririm. Harici depolama birimine nasıl kaydedeceğiniz hakkında daha fazla bilgiyi burada bulabilirsiniz: http://developer.android.com/guide/topics/data/data-storage.html#filesExternal


Ekstra izin (SD Kart) gerektirmez mi?
rishabh

Evet, SD karta yazacağınızdan beri olacaktır.
trenpixster

1
Deneyimlerime göre, kullanıcı için ne kadar az izin gerekiyorsa o kadar iyi olur. Yukarıda belirtildiği gibi Gson kullanılması uygun bir seçenek değilse, SD Kart ikincil bir seçim olmalıdır.
rishabh

Evet, ben de buna katılıyorum; Yalnızca JSON sonucu yeterince büyükse SD kart bir seçenek olmalıdır. Söyleyeceğim bir değiş tokuş.
trenpixster

0

Paylaşılan tercihlerle ilgili tüm sorununuzu çözen iki dosya var

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

şimdi kaydedebilir, kaldırabilir veya beğenebilirsiniz,

-kayıt etmek

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

-Kaldırmak

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

-almak

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

0

Verileri SharedPreference'de depola

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

0

Listesine kaydetmek için utils sınıfım 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);
    }
}

kullanma

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

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

.
Araçlarımın tam kodu // Etkinlik kodunda örneği kullanarak kontrol edin


0

Nesnelerimi saklamak için jackson kullandım ( jackson ).

Sıralamaya jackson kütüphanesi eklendi:

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'

Test sınıfım:

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

Java Nesnesi JSON'a:

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

Paylaşılan tercihlerde saklayın:

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

Paylaşılan tercihlerden geri yükleyin:

ObjectMapper objectMapper = new ObjectMapper();
Car car = objectMapper.readValue(preferences.car().get(), Car.class);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.