Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use SharedPreferences as LocalStore, in more generic way?

Being new in Android world and advancing with joy day by day ;) I would like to share examples about common usage.

Here comes example about using SharedPreferences with generic LocalStore class.

create a common class to be used by your main activity or by any of sub-activity.

    public class LocalStore {

        private static final String TAG = "LocalStore";
        private static final String PREF_FILE_NAME = "userprefs";

        public static void clear(Context context) {
            clear(context, "unknown");
        }
        public static void clear(Context context, String caller) {
            Editor editor = 
                context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE).edit();
            editor.clear();
            editor.commit();
            Log.d(TAG, "caller:"+caller + "|clear LocalStore");
        }

        public static boolean setCustomBooleanData(String key, boolean value, Context context) {
        Editor editor =
            context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE).edit();
        editor.putBoolean(key, value);

        return editor.commit(); 
    }
    public static boolean getCustomBooleanData(String key, Context context) {
        SharedPreferences savedSession =
            context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE);

        return (savedSession.getBoolean(key, false));
    }

    public static boolean setCustomStringData(String key, String value, Context context) {
        Editor editor =
            context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE).edit();
        editor.putString(key, value);

        return editor.commit(); 
    }
    public static String getCustomStringData(String key, Context context) {
        SharedPreferences savedSession =
            context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE);

        return (savedSession.getString(key, null));
    }


    public static boolean isCustomStringExistInLocal(String customKey, Context context) {
        SharedPreferences savedSession =
            context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE);

        return (savedSession.getString(customKey, null))==null?false:true;
    }

public static boolean saveObject(String objKey, Serializable dataObj, Context context) {
        Editor editor =
            context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE).edit();
        editor.putString(objKey, ObjectSerializer.serialize(dataObj) );

        Log.d(TAG, "savedObject| objKey:"+objKey+"/" + dataObj.toString());

        return editor.commit(); 
    }
    public static Object getObject(String objKey, Context context) {
        SharedPreferences savedSession =
            context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE);

        Object dataObj = ObjectSerializer.deserialize(savedSession.getString(objKey, null));

        return dataObj;
    }

    }

Note: You can use ObjectSerializer from here

Enjoy!

Additional update: I implemented a library to use MEMDISKCACHE and SHAREDPREF as GENERIC_STORE anyone interested can use it from
-> https://github.com/wareninja/generic-store-for-android

like image 814
Yilmaz Guleryuz Avatar asked Oct 31 '10 20:10

Yilmaz Guleryuz


Video Answer


1 Answers

Assuming you want some tips on how to improve it even more, here you go.

  • Usually Android follows a convention to keep the Context variable as the first parameter. It is good practice to do this when creating any general library.
  • If you want to make it more generic, why not try method overloading? It will give the developer more flexibility when setting values much like how extras are handled in the Intent class.

For example:

public static boolean setData(Context, String key, boolean value) {
        Editor editor = context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE).edit();
        editor.putBoolean(key, value);
        return editor.commit(); 
    }
public static boolean setData(Context, String key, String value) {
        Editor editor = context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE).edit();
        editor.putString(key, value);
        return editor.commit(); 
    }

So you can simply call the overloaded functions like this:

setData(this, "myBoolean", true);
setData(this, "myString", "Its Awesome");
like image 188
Umair Avatar answered Oct 12 '22 01:10

Umair