Android - save Object to SharedPreferences and get it anywhere in the app
Solution 1
Replace your existing User class with below
public class User implements Serializable
{
private static User userInstance = null; // the only instance of the class
private String userName; // userName = the short phone number
private User(){}
public static User getInstance()
{
if (userInstance == null)
{
userInstance = new User();
}
return userInstance;
}
public String getUserName()
{
return userName;
}
public void setUserName(String p_userName)
{
userName = p_userName;
}
@Override
public String toString()
{
return "User [userName=" + getUserName() + "]";
}
}
Initialize User Name
User m_user = User.getInstance();
m_user.setUserName(name);
Convert the object to a String
Gson gson = new Gson();
String stringUser = gson.toJson(m_user);
GeneralMethods.saveData(VerificationActivity.this,"userObject",stringUser);
Solution 2
We can do this by using Gson library. And shared preference is accessible through out the application. I have created my own class to access shared pref with getter and setter of all type like String, Int, Object etc.
To use Gson Library, Below is the code. If you want the class that I have created then let me know
You can use gson.jar to store class objects into SharedPreferences. You can downlaod this jar from here https://code.google.com/p/google-gson/downloads/list
Or add GSON dependency in Gradle file
compile 'com.google.code.gson:gson:2.5'
To Save
Editor prefsEditor = mPrefs.edit();
Gson gson = new Gson();
String json = gson.toJson(MyObject);
prefsEditor.putString("MyObject", json);
prefsEditor.commit();
To Retreive
Gson gson = new Gson();
String json = mPrefs.getString("MyObject", "");
MyObject obj = gson.fromJson(json, MyObject.class);
Hope this helps you Summved
Solution 3
I'd suggest you to use Dependency Injection pattern.
I usually create Preferences
class which exposes getters and setters to quickly read and save values to SharedPreferences
.
I inject the same instance of Preferences
anywhere in the code using Dagger as Dependency Injector.
Why use Singleton object over public static
helpers?
If you have a helper class of utility functions that you're using directly, it creates a hidden dependency; you have no control over who can use it, or where. Injecting that same helper class via a stateless singleton instance lets you control where and how it's being used, and replace it / mock it / etc. when you need to.
Read more here.
Example of Preferences
class:
@Singleton
public class Preferences {
private SharedPreferences sharedPreferences;
private final String NOTIFICATIONS_ENABLED = "NOTIFICATIONS_ENABLED";
@Inject
public Preferences(Context context) {
sharedPreferences = context.getSharedPreferences("Preferences", 0);
}
public void setNotificationsEnabled(boolean enabled){
SharedPreferences.Editor edit = sharedPreferences.edit();
edit.putBoolean(NOTIFICATIONS_ENABLED, enabled);
edit.commit();
}
public boolean isNotificationsEnabled(){
return sharedPreferences.getBoolean(NOTIFICATIONS_ENABLED, true);
}
}
and how to use it in Activity
:
public class MainActivity extends Activity {
@Inject
NavigationController navigationController;
@Inject
Preferences preferences;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SharedObjectGraph.getObjectGraph().inject(this);
if(preferences.isNotificationsEnabled()){
// do something
}
}
Solution 4
You need to just replace one line of code
user = GeneralMethods.getData(SplashScreenActivity.this,value,"userObject");
To
user = GeneralMethods.getData(SplashScreenActivity.this,"userObject",value);
![Alex](https://i.stack.imgur.com/RmoNQ.png?s=256&g=1)
Comments
-
Alex over 3 years
In my app I have a custom
User
class which holds some regular data (name etc...). I need to save that object and get it anywhere and anytime in other pages of the app. I made a helper classpublic final class GeneralMethods
with many methods which I use a lot (static, of course).
In order to save the data Im usingGson
library. I made this method:public static void saveData(Context con, String variable, String data) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(con); prefs.edit().putString(variable, data).apply(); }
To save an object, I use this method as follows:
Gson gson = new Gson(); String stringUser = gson.toJson(newUser); GeneralMethods.saveData(VerificationActivity.this,"userObject",stringUser);
To load the data back, I'm using this static method:
public static String getData(Context con, String variable, String defaultValue) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(con); String data = prefs.getString(variable, defaultValue); return data; }
I dont really know how to get the data back, this is what I've done so far:
Gson gson = new Gson(); String user=""; String value=""; user = GeneralMethods.getData(SplashScreenActivity.this,value,"userObject");
Im struggling with the
getData
method, how do I parse the data fromString
back to theUser
type?
EDIT
I tried the suggestions bellow and I always getNULL
. Maybe I dont save the object in the right way?
EDIT2
It seems Im not generating the object correctly and therefore nothing is being saved. This is the user "Singleton" class:public class User implements Serializable { private static User userInstance=null; //the only instance of the class private static String userName; //userName = the short phone number private User(){} public static User getInstance(){ if(userInstance ==null){ userInstance = new User(); } return userInstance; } public static User getUserInstance() { return userInstance; } public String getUserName(){ return this.userName; } public static void setUserName(String userName) { User.userName = userName; } public static void init(String _userName) { User.setUserName(_userName); } }
This is how i setup the object with the relevant data (user name as the constructor parameter):
User.init(name);
This is how i convert the object to a
String
:Gson gson = new Gson(); String stringUser = gson.toJson(User.getInstance()); GeneralMethods.saveData(VerificationActivity.this,"userObject",stringUser);