Утилита SharedPreferences В Android


Я просто создан служебный класс для общих настройках Андроида. Я хочу знать, это хорошо работает на другие устройства пользователей и полезно для учащихся.

Мой код в Гист

import android.content.Context;
import android.content.SharedPreferences;
import android.support.annotation.NonNull;
import android.util.Log;

import java.util.Map;
import java.util.Set;

/**
 * A utility class for android {@link SharedPreferences}.
 * All the creation of {@link SharedPreferences} use
 * MODE_PRIVATE constant of {@link Context} class.
 * Created on 2/4/2018
 *
 * @author Nyein Chan Aung
 * @version 1.0
 */

public final class SharedPrefUtils {

    private SharedPreferences sharedPref;
    private SharedPreferences.Editor editor;

    /**
     * A private constructor and initialize a {@link SharedPreferences} and
     * a {@link SharedPreferences.Editor}.
     *
     * @param context Context
     * @param name    {@link SharedPreferences}'s name
     */
    private SharedPrefUtils(Context context, String name) {
        sharedPref = context.getSharedPreferences(name, Context.MODE_PRIVATE);
        editor = sharedPref.edit();
    }

    /**
     * Create an instance of this class. Create a new instance whenever this
     * method is called.
     *
     * @param context Context
     * @param name    {@link SharedPreferences}'s name
     * @return SharedPrefUtils object
     */
    public static SharedPrefUtils init(@NonNull Context context, @NonNull String name) {
        return new SharedPrefUtils(context, name);
    }

    /**
     * This method return a {@link SharedPreferences} object with given
     * name. The main purpose of this method is to use all getX() method of
     * {@link SharedPreferences} class. You can also create a {@link SharedPreferences}
     * and use in normal way.
     *
     * @param context
     * @param name
     * @return {@link SharedPreferences}
     */
    public static SharedPreferences myPref(@NonNull Context context, @NonNull String name) {
        return context.getSharedPreferences(name, Context.MODE_PRIVATE);
    }

    /**
     * Put value to preferences depend on data type.
     *
     * @param k key
     * @param v value
     */
    public SharedPrefUtils put(String k, Object v) {
        if (v instanceof Boolean) {
            editor.putBoolean(k, (Boolean) v);
        } else if (v instanceof Integer) {
            editor.putInt(k, (Integer) v);
        } else if (v instanceof Integer) {
            editor.putInt(k, (Integer) v);
        } else if (v instanceof String) {
            editor.putString(k, (String) v);
        } else if (v instanceof Float) {
            editor.putFloat(k, (Float) v);
        } else if (v instanceof Long) {
            editor.putLong(k, (Long) v);
        } else try {
            editor.putStringSet(k, (Set<String>) v);
        } catch (ClassCastException e) {
            e.printStackTrace();
        }
        return this;
    }

    /**
     * Remove a preference value of given string key
     * if exist.
     *
     * @param key String, key to remoe
     * @return SharedPrefUtils
     */
    public SharedPrefUtils remove(String key) {
        editor.remove(key);
        return this;
    }

    /**
     * Commit Preferences changes and clear all data.
     *
     * @return boolean true on success, false on failure
     */
    public boolean finish() {
        if (sharedPref != null && editor != null) {
            boolean flag = editor.commit();
            sharedPref = null;
            editor = null;
            return flag;
        }
        return false;
    }

    /**
     * Show info of the preference with the name provided
     * in init method. The value will get from toString() method.
     */
    public void log() {
        Map<String, ?> map = sharedPref.getAll();
        for (Map.Entry<String, ?> entry : map.entrySet()) {
            Log.i("info - " + getClass().getName() + " : ", entry.getKey() + " : " + entry.getValue().toString());
        }
    }
}

Использование

////////////////////////////
To put value in preferences.
////////////////////////////
SharedPrefUtils.init(this, "my_pref")
                        .put("int_pref", 1203)
                        .put("float_pref", 1.203f)
                        .put("bool_pref", true)
                        .put("str_pref", "String Pref")
                        .put("long_pref", 100000000000099L)
                        .put("set_pref", setObject)
                        .finish();

////////////////////////////////////////////////////////////////////
To get value in preferences, use static method myPref(contex, name).
////////////////////////////////////////////////////////////////////
SharedPrefUtils.myPrfe(context, "my_pref").getFloat("float_pref", 0.0f);// assume context as a Context object.

/////////////////////////////////
To remove a value in preferences.
/////////////////////////////////
SharedPrefUtils.init(this, "my_pref").remove(keyToRemove).finish();


393
2
задан 11 февраля 2018 в 10:02 Источник Поделиться
Комментарии
2 ответа

Если бы я был пользователем этой программы, я бы предпочел знать допустимые типы, без того, чтобы проверить фактический код. Итак, я хотел создать положить(строковый ключ, int значение), поставить(строковый ключ, строковое значение)...

В моих проектах обычно есть подобный класс, переопределение тоже get методы (для снятия нужно объявить возвращаемое значение по умолчанию).

2
ответ дан 11 февраля 2018 в 02:02 Источник Поделиться

Не то, не это, не это, это должно быть методы stringset!

else try {
editor.putStringSet(k, (Set<String>) v);
} catch (ClassCastException e) {
e.printStackTrace();
}
return this;

Допустим, вы бы попробовать поставить Map здесь, тогда этот код будет работать. Вы бы печати трассировки стека (конечный пользователь не будет видеть это, и это не на первом месте программист будет выглядеть либо), а вы бы молча не получится. Не делай этого. Вместо того, чтобы бросать исключение. Не оставляйте номер для скрытые ошибки.

Готово!

public boolean finish() {
if (sharedPref != null && editor != null) {
boolean flag = editor.commit();
sharedPref = null;
editor = null;
return flag;
}
return false;
}

Допустим, что editor.commit(); будет возвращать false. Ладно, вы бы вернуть тот статус, который является хорошим. Но ты никак не называть editor.commit() опять же, как вы очищаете sharedPref и editor

С чистого API для Android

Давайте представим, что вы не будете использовать свой служебный класс и использовать чистый API для Android, ваша использования это:

SharedPrefUtils.init(this, "my_pref")
.put("int_pref", 1203)
.put("float_pref", 1.203f)
.put("bool_pref", true)
.put("str_pref", "String Pref")
.put("long_pref", 100000000000099L)
.put("set_pref", setObject)
.finish();

Чистого использования API для Android будет так:

this.getSharedPreferences("my_pref", Context.MODE_PRIVATE).edit()
.putInt("int_pref", 1203)
.putFloat("float_pref", 1.203f)
.putBoolean("bool_pref", true)
.putString("str_pref", "String Pref")
.putLong("long_pref", 100000000000099L)
.putStringSet("set_pref", setObject)
.commit();

Лично я рекомендовал бы другим учащимся использовать вместо чистого API для Android.
Написание служебных классов, как это может быть хорошо для вашего собственного обучения, но подумайте, если вы предоставите больше функциональности или если вы на самом деле взять функционал.

2
ответ дан 11 февраля 2018 в 04:02 Источник Поделиться