Android SharedPreferencesがオブジェクトを保存/保存する方法


214

多くのフィールドを含む多くの場所でユーザーオブジェクトを取得する必要があります。ログイン後、これらのユーザーオブジェクトを保存/保存します。この種のシナリオをどのように実装できますか?

次のように保存することはできません。

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

保存したいデータのタイプは?
ilango j


〜」エグゼクティブオブジェクトはどういう意味ですか?StackOverflowに投稿する前に、文法を確認してください。
IgorGanapolsky 2016年

あなたは多くの機能を備えたこのライブラリを使用することができます... github.com/moinkhan-in/PreferenceSpider
Moinkhan

回答:


547

gson.jarを使用して、クラスオブジェクトをSharedPreferencesに保存できます。このjarはgoogle-gsonからダウンロードできます

または、GradleファイルにGSON依存関係を追加します。

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

共有設定の作成:

SharedPreferences  mPrefs = getPreferences(MODE_PRIVATE);

保存する:

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

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

取得するには:

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

9
ありがとう、友達!ただし、保存部分(3行目)は正しくありません。正しいコードは次のとおりです。String json = gson.toJson(myObject);
セサルフェレイラ2013

3つすべてのjarファイルが必要ですか?そのリンクには3つあります。。。
coolcool1994 2014

3
jarをダウンロードするための正しいURLは、search.maven.org
Shajeel Afzal

2
これは、よりここでStackOverflowExceptionがxDで読むにリード線があること循環参照に問題があるstackoverflow.com/questions/10209959/...
phuwin

1
@rozinaはいGsonの方が優れています。まず、serializeを使用するには、オブジェクトとその内部のすべてのオブジェクトでserializeインターフェイスを実装する必要があります。これはgsonには必要ありません。gsonは、オブジェクトがオブジェクトのリストである場合にも適切に機能します。
Neville Nazerane 2017年

36

@MuhammadAamirALiの回答に追加するには、Gsonを使用してオブジェクトのリストを保存および取得できます

ユーザー定義オブジェクトのリストをSharedPreferencesに保存

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

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

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

SharedPreferencesからユーザー定義オブジェクトのリストを取得する

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

3
「タイプ」とは何ですか?(リストの取得、2行目)。
ガンガダース2014年

15

このスレッドは少し古いです。しかし、とにかくこれが誰かの助けになることを願ってこれを投稿するつもりです。オブジェクトを文字列にシリアル化することにより任意のオブジェクトのフィールドを共有設定に格納できます。ここでは、共有設定にオブジェクトを格納するために使用しました。GSON

オブジェクトを設定に保存:

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

設定からオブジェクトを取得:

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

注意 :

グラドルに追加することcompile 'com.google.code.gson:gson:2.6.2'を忘れないdependenciesでください。

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

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

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

更新:

@Sharp_Edgeがコメントで指摘したように、上記のソリューションはでは機能しませんList

getSavedObjectFromPreference()-からClass<GenericClass> classTypetoのシグネチャを少し変更するType classTypeと、このソリューションが一般化されます。変更された関数シグネチャ、

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

呼び出すには、

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

ハッピー コーディング!


1
これは本当に役に立ちました。ここでコメントしたい人のために... saveObjectToSharedPreferenceの呼び出しをonSaveInstanceStateに入れるべきですか?今はonSaveInstanceStateにありますが、アプリが10秒ごとにリアルタイムデータを収集していると、時々しゃっくりが発生し、saveObjectToSharedPreferenceで保存しているオブジェクトの一部の読み取りが失われます。すべての考えは大歓迎です。
Frank Zappa、2016

ちょっと@FrankZappaは、完全にあなたが行くここにあなたの問題を理解することではなく、私を許して、使用してみてくださいcommit代わりにapply。それはあなたを助けるかもしれません。
tpk

ありがとう。説明させてください。私のAndroidアプリは、約10秒ごとにリアルタイムでデータを収集します。このデータ収集はオブジェクトを使用せず、グローバル変数とロジックのみを使用します。次に、データが要約され、Javaオブジェクトに格納されます。上記のメソッドを使用して、SharedPreferencesにJavaオブジェクトを格納および取得します。これは、a)onSavedInstanceStateにオブジェクトを格納できないこと、およびb)画面が回転したときにオブジェクトが破棄されて再作成されるためです。したがって、私はSharedPrefsアプローチを使用しているので、画面が回転してもオブジェクトはその値を失いません。(続き)
Frank Zappa

saveObjectToSharedPreferencesルーチンをonSaveInstanceStateに配置しました。getSavedObjectFromPreferenceルーチンをonRestoreInstanceStateに配置しました。しかし、私はテストしましたが、画面の回転が原因で1セットの見逃したオブジェクトの更新を取得しました。したがって、saveObjectToSharedPreferencesの呼び出しを実際のロジックの近くに移動する必要がありますか?最後に、どのメソッドがコミットして適用されるのですか?
Frank Zappa

1
@ 2943あなたのソリューションは素晴らしく見えますが、たとえばリストがある場合、どうすればList<CustomClass>よいですか? getSavedObjectFromPreference(context, "mPreference", "mObjectKey", SampleClass.class)受け付けていませんList<CustomClass>.class:(
シャープエッジ

6

Constantsデータをフェッチまたは保存するキーまたは変数を保存するグローバルクラスを作成することをお勧めします。

データを保存するには、このメソッドを呼び出して、どこからでもデータを保存します。

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

データを取得するために使用します。

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

そして、このような方法はトリックを行います

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

データを取り戻すために、「変数」と「defaultValue」として何を渡しますか?
Alex

Constantsクラスを作成しないでください。これにより、コードが高度に結合され、同時に分散されます。
Miha_x64 2018

5

この最善の方法を試してください:

PreferenceConnector.java

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

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


    public static final String name = "name";


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

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

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

    }

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

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

    }

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

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

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

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

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

}

値を書く:

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

そして、以下を使用して値を取得します。

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

2
これは、AndroidのSharedPreferencesにオブジェクトを保存することとどう関係していますか?
IgorGanapolsky 2016年

Sharedpreferencesの使用に関する詳細は、stackoverflow.com / a / 2614771/1815624を参照して ください。return PreferenceManager.getDefaultSharedPreferences(context);代わりに使用したい場合がありますreturn context.getSharedPreferences(PREF_NAME, MODE);
CrandellWS

3

prefsEditorこの後、オブジェクトをどのように処理するかは述べていませんが、設定データを永続化するために、次のものも使用する必要があります。

prefsEditor.commit();

2

ここを参照してください、これはあなたを助けることができます:

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

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

        return editor.commit();
    }

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


2
これは現在「コードの束」を表しているだけなので、コードについてもう少し説明してください。
ヴェルナー

1

Json形式を使用せずにandroid sharedpreferencesからオブジェクトを保存および復元する別の方法

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

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

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

            editor.apply();
        }

1

ライブラリを使用せずに設定でオブジェクトを保存できます。まず、オブジェクトクラスでSerializableを実装する必要があります。

public class callModel implements Serializable {

private long pointTime;
private boolean callisConnected;

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

}

次に、これらの2つのメソッドを使用して、オブジェクトを文字列に、文字列をオブジェクトに変換します。

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

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

保存する:

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

読む

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

これらのバイトを別のファイルに書き込むだけで、Base64エンコードとXMLエスケープを回避できます。
Miha_x64 2018

1

ステップ1:これら2つの関数をコピーしてJavaファイルに貼り付けます。

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


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

ステップ2: 使用を保存するには:

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

使用を取得するには:

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

次のような異なるキー名を使用して、異なる共有設定を設定できます。

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

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

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

1

応答として取得したオブジェクト全体を保存したい場合は、次のようなことを行うことで達成できます。

まず、次のように、utilクラスでJSONを文字列に変換するメソッドを作成します。

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

次に、共有設定クラスで次のようにします

 public void storeLoginResponse(yourResponseClass objName) {

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

次にgetPreferencesのメソッドを作成します

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

次に、応答を受け取ったときにFirstメソッドを呼び出し、次のような共有設定からデータを取得する必要があるときに2番目を呼び出します。

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

それで全部です。

それがあなたを助けることを願っています。

Happy Coding();


1

承認された回答を使用して、アクティビティ全体で共有設定データにアクセスするのに問題がありました。これらの手順では、getSharedPreferencesにアクセスするための名前を付けます。

Gradleスクリプトの下のbuild.gradel(モジュール:app)ファイルに次の依存関係を追加します。

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

保存する:

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

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

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

別のアクティビティで取得するには:

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

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

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

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

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

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

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

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

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

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

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

public class User {

    public String getName() {
        return name;
    }

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

    public String getEmail() {
        return email;
    }

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

    public String getPhone() {
        return phone;
    }

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

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

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

これがあなたを助けることを願っています:)


1

ここで、私がここから取得したKotlin委任プロパティの使用方法を紹介しますが、SharedPreferenceプロパティを取得/設定するための簡単なメカニズムを拡張します。

以下のためにStringIntLongFloatまたはBoolean、それは標準SharePreferenceゲッター(S)とセッター(複数可)を使用します。ただし、他のすべてのデータクラスでは、GSONを使用Stringして、セッターのにシリアル化します。次に、getterのデータオブジェクトに逆シリアル化します。

他のソリューションと同様に、GSONをGradleファイルの依存関係として追加する必要があります。

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

これは、SharedPreferencesに保存して保存できるようにする簡単なデータクラスの例です。

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

以下は、プロパティデリゲートを実装する1つのクラスです。

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

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

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

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

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

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

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

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

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

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

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

注:で何も更新する必要はありませんsealed class。委任プロパティは、オブジェクト/シングルトンあるUserPreferencePropertyNullableUserPreferencePropertyFirstTimeUser

SharedPreferencesから保存/取得するための新しいデータオブジェクトを設定するには、次の4行を追加するだけです。

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

最後に、byキーワードを使用するだけで、SharedPreferencesに値を読み書きできます。

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

オブジェクトが複雑な場合は、シリアル化/ XML / JSONして、その内容をSDカードに保存することをお勧めします。外部ストレージに保存する方法の詳細については、http//developer.android.com/guide/topics/data/data-storage.html#filesExternalをご覧ください。


それは追加の許可(SDカード)を必要としませんか?
リシャブ2014年

はい、SDカードに書き込むためです。
trenpixster 2014年

1
私の経験では、ユーザーに必要な権限は少ないほど良いです。上記のGsonの使用が現実的な選択肢ではない場合、SDカードは2番目の選択肢です。
リシャブ2014年

うん、私もそれに同意します。JSONの結果が十分に大きい場合にのみ、SDカードを選択できます。それは私が言うトレードオフです。
trenpixster 2014年

0

sharedpreferencesに関するすべての問題を解決した2つのファイルがあります

1)AppPersistence.java

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

    private static AppPersistence mAppPersistance;
    private SharedPreferences sharedPreferences;

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

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

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

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

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

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

2)AppPreference.java

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

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

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

今、あなたは保存、削除、または好きになることができます、

-保存する

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

-削除する

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

-取得する

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

0

SharedPreferenceにデータを保存する

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

0

リストを保存するための私のutilsクラス SharedPreferences

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

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

    ...

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

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

使用する

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

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


私のユーティリティの完全なコード //アクティビティコードの例を使用してチェック


0

ジャクソンを使用してオブジェクトを保存しました(ジャクソン)。

グラドルにジャクソンライブラリを追加:

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

私のテストクラス:

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

JSONへのJavaオブジェクト:

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

共有設定に保存します。

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

共有設定からそれを復元します。

ObjectMapper objectMapper = new ObjectMapper();
Car car = objectMapper.readValue(preferences.car().get(), Car.class);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.