Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SharedPreferences helper class

Tags:

java

android

I am doing SharedPreferences helper class to make my code looks nice.

public class SharedPreferencesHelper {
    Context context;

    public SharedPreferencesHelper(Context context){
        this.context = context;
    }

    public boolean isLogged(String prefs){
        return context.getSharedPreferences(prefs,Context.MODE_PRIVATE)
                      .getBoolean("LOGGED",false);
    }

    public void setLogged(String prefs){
        context.getSharedPreferences(prefs,Context.MODE_PRIVATE)
               .edit().putBoolean("LOGGED",true).apply();
    }
}

The question is should I make these methods static and initialize SharedPreferences in each method or better to left it not static and call SharedPreferencesHelper class once from my other classes? Thanks

like image 733
Anton Kazakov Avatar asked Mar 10 '16 09:03

Anton Kazakov


People also ask

What is SharedPreferences in Kotlin?

A SharedPreferences object points to a file containing key-value pairs and provides simple methods to read and write them. Each SharedPreferences file is managed by the framework and can be private or shared. This page shows you how to use the SharedPreferences APIs to store and retrieve simple values.

Is SharedPreferences Singleton?

There are 2 templates and samples: SharedPreferences Singleton that uses String keys. SharedPreferences Single that uses Enum keys.

What is SharedPreferences example?

Shared Preferences can be thought of as a dictionary or a key/value pair. For example, you might have a key being “username” and for the value, you might store the user's username. And then you could retrieve that by its key (here username).

Can we store HashMap in SharedPreferences?

This example demonstrates about How can I save a HashMap to Shared Preferences in Android. Step 1 − Create a new project in Android Studio, go to File ⇒ New Project and fill all required details to create a new project. Step 2 − Add the following code to res/layout/activity_main. xml.


2 Answers

Use this :

public class SharedPreferencesHelper {

public static final String FILE_NAME = "APP_PREFERENCES";

  public static void put(Context context, String key, Object object) {

    SharedPreferences sp = context.getSharedPreferences(FILE_NAME,  Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sp.edit();
    if (object instanceof String) {
        editor.putString(key, (String) object);
    } else if (object instanceof Integer) {
        editor.putInt(key, (Integer) object);
    } else if (object instanceof Boolean) {
        editor.putBoolean(key, (Boolean) object);
    } else if (object instanceof Float) {
        editor.putFloat(key, (Float) object);
    } else if (object instanceof Long) {
        editor.putLong(key, (Long) object);
    } else {
        editor.putString(key, object.toString());
    }
    SharedPreferencesCompat.apply(editor);
}

   public static Object get(Context context, String key, Object defaultObject) {

    SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);

    if (defaultObject instanceof String) {
        return sp.getString(key, (String) defaultObject);
    } else if (defaultObject instanceof Integer) {
        return sp.getInt(key, (Integer) defaultObject);
    } else if (defaultObject instanceof Boolean) {
        return sp.getBoolean(key, (Boolean) defaultObject);
    } else if (defaultObject instanceof Float) {
        return sp.getFloat(key, (Float) defaultObject);
    } else if (defaultObject instanceof Long) {
        return sp.getLong(key, (Long) defaultObject);
    }

    return null;
}

public static void remove(Context context, String key) {
    SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sp.edit();
    editor.remove(key);
    SharedPreferencesCompat.apply(editor);
}

public static void clear(Context context) {
    SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sp.edit();
    editor.clear();
    SharedPreferencesCompat.apply(editor);
}

public static boolean contains(Context context, String key) {
    SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
    return sp.contains(key);
}

public static Map<String, ?> getAll(Context context) {
    SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
    return sp.getAll();
}



private static class SharedPreferencesCompat {
    private static final Method sApplyMethod = findApplyMethod();

    @SuppressWarnings({"unchecked", "rawtypes"})
    private static Method findApplyMethod() {
        try {
            Class clz = SharedPreferences.Editor.class;
            return clz.getMethod("apply");
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }

        return null;
    }

    public static void apply(SharedPreferences.Editor editor) {
        try {
            if (sApplyMethod != null) {
                sApplyMethod.invoke(editor);
                return;
            }
        } catch (IllegalArgumentException | IllegalAccessException | InvocationTargetException e) {
            e.printStackTrace();
        }
        editor.commit();


    }
}
 }
like image 118
MrZ Avatar answered Oct 18 '22 13:10

MrZ


I wouldn't keep a reference to the context. I would rather keep the SharedPreference and its Editor as static member of your helper class. This way you won't need to instantiate SharedPreferencesHelper every time you need to read/write the SharedPreference. One step further would use the Application Context (with a your custom Application subclass) to initialize both SharedPreference and Editor, the first time you access the helper itself. That's how I would shape it

like image 41
Blackbelt Avatar answered Oct 18 '22 13:10

Blackbelt