I am passing a jsonobject string value to my shared preferences and commiting it. But while fetching this, its returning the default value.
For putting :
public void new_putMultipleProfileData(String got_multiple_json_data){
Editor editor=app_prefs.edit();
editor.putString(NEW_TESTING_PIC_ID, got_multiple_json_data);
editor.commit();
}
For getting :
public String new_getMultipleProfileData(){
return app_prefs.getString(NEW_TESTING_PIC_ID,"0");
}
Complete Preference Helper Class :
public class PreferenceHelper {
private final String PREF_NAME = "Testing_xyz";
private SharedPreferences app_prefs;
//For Testing
public static final String NEW_TESTING_PIC_ID = "testing";
private Context context;
public PreferenceHelper(Context context) {
app_prefs = context.getSharedPreferences(PREF_NAME,
Context.MODE_PRIVATE);
this.context = context;
}
public void new_putMultipleProfileData(String got_multiple_json_data){
AppLog.Log("new_data_80503","got_multiple_json_data "+got_multiple_json_data);
Editor editor=app_prefs.edit();
editor.putString(NEW_TESTING_PIC_ID, "hello");
editor.commit();
}
public String new_getMultipleProfileData(){
AppLog.Log("new_data_80503","new_getMultipleProfileData "+app_prefs.getString(NEW_TESTING_PIC_ID,"0"));
return app_prefs.getString(NEW_TESTING_PIC_ID,"0");
}
}
If you want to use same preference manager across the app then use defaultSharedPreference. getSharedPreferences return preference file for that context only, it is different for different context.
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
or
you can use ApplicationContext instead of context
Related
I am having troubles using SharedPreferences in an Android app, and I need to get clear on it.
To avoid issues I have created a separated class for all maters regarding SharedPreferences to be used in the app.
This is the class:
public class SharedPreferencesClasMiPaciente {
SharedPreferences prefs;
Context context;
private static String PREFS = "MiPaciente";
public static SharedPreferences getPrefs(Context context){
return context.getSharedPreferences(PREFS,Context.MODE_PRIVATE);
}
public static void insertData(Context context,String key,String value){
SharedPreferences.Editor editor=getPrefs(context).edit();
editor.putString(key,value);
editor.commit();
}
public static void insertDataInt(Context context,String key,Integer value){
SharedPreferences.Editor editor=getPrefs(context).edit();
editor.putInt(key,value);
editor.commit();
}
public static void insertDataLong(Context context,String key,Long value){
SharedPreferences.Editor editor=getPrefs(context).edit();
editor.putLong(key,value);
editor.commit();
}
public static void insertStringSet(Context context,String key,Set<String> value){
getPrefs(context).edit().putStringSet(key,value).commit();
}
public static String retriveData(Context context,String key){
return getPrefs(context).getString(key,"no hay datos");
}
public static int retriveDataInt(Context context,String key){
return getPrefs(context).getInt(key,0);
}
public static long retriveDataLong(Context context,String key){
return getPrefs(context).getLong(key,0);
}
public static Set<String> getStringSet(Context context, String key){
return getPrefs(context).getStringSet(key,null);
}
public static void deleteData(Context context,String key){
SharedPreferences.Editor editor=getPrefs(context).edit();
editor.remove(key);
editor.commit();
}
}
I try to call this class every time I need to get or insert new SharedPreferences Data.
For now, to retrieve data inside a Fragment, I am using this code:
hayFotos = SharedPreferencesClasMiPaciente.retriveDataInt(getContext(),"hayFotos");
To insert data inside a Fragment, I am using this code:
SharedPreferencesClasMiPaciente.insertData(getContext(),"codigo_exploracion_actual",cod_exploracion);
To retrieve data in an Activity, I am using this code:
hayFotos = SharedPreferencesClasMiPaciente.retriveDataInt(this,"hayFotos");
To insert data in an Activity, I am using this code:
SharedPreferencesClasMiPaciente.insertDataInt(getApplicationContext(),"hayFotos",1);
This way is working but not always, there is another fragment where using the same methods, it is getting a different value for the same key:
hayFotos = SharedPreferencesClasMiPaciente.retriveDataInt(getContext(),"hayFotos");
Log.d("test shared","test shared hay fotos "+hayFotos);
At this case I am always getting the value 0 for key "hayFotos".
Is there a way to get SharedPreferences data on all fragments and activities inside an app?
Is it normal for shared preference reset the value after I try to hot restart or reopening an app ? because my preference become null after I do that.
Thank you.
i fix this problem by remove this line from my app :
SharedPreferences.setMockInitialValues({});
void main() {
// ignore: invalid_use_of_visible_for_testing_member
SharedPreferences.setMockInitialValues({});
runApp(MyApp());
}
I hope this will work for you.
Make Singleton class of SharedPreference
public class SessionManager {
public SharedPreferences prefs;
private Context _Context;
private SharedPreferences.Editor editor;
private static final String PREF_NAME = "YourAppName";
private static final int PREF_MODE = 0;
public SessionManager(Context context) {
if (context != null) {
this._Context = context;
prefs = context.getSharedPreferences(PREF_NAME, PREF_MODE);
editor = prefs.edit();
}
}
public static final String KEY_NAME = "name";
public void setKeyUserName(String name) {
editor.putString(KEY_NAME, name);
editor.commit();
}
public String getKeyUserName() {
return prefs.getString(KEY_NAME, null);
}
}
How to use: In Activity / Fragment
public SessionManager sessionManager;
sessionManager = new SessionManager(YourActivityContext);
For Saving data:
sessionManager.setKeyUserName("Your Value");
For getting Data:
sessionManager.getKeyUserName();
I have a problem where my shared preferences are not working in a class file.I am confused and not able to solve it.Below is my file globalfile which saves data as follows.
public class globalfile extends Activity {
SharedPreferences sharedpreferences;
public static final String mypreference = "mypref";
public static final String Pwd = "pwdKey";
public static final String Email = "emailKey";
private static String global_username = "null/", global_pwd = "null/";
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sharedpreferences = getSharedPreferences(mypreference,
Context.MODE_PRIVATE);
}
public String getusername() {
global_username = sharedpreferences.getString(Email, "");
return global_username;
}
public String getuserpwd() {
global_pwd = sharedpreferences.getString(Pwd, "");
return global_pwd;
}
public void setusername(String someVariable) {
global_username = someVariable;
SharedPreferences.Editor editor = sharedpreferences.edit();
editor.putString(Email,global_username);
editor.commit();
}
public void setuserpwd(String someVariable) {
global_pwd = someVariable;
SharedPreferences.Editor editor = sharedpreferences.edit();
editor.putString(Pwd,global_pwd);
editor.commit();
}
}
I first called setuserpwd() & setusername() then getuserpwd() & getusername() from another activity using object of class globalfile.But always returns null.although if I use this code without shared pref.it is working fine
create an instance of Activity with Activity class object
Technically, you can create an instance of an Activity class. but, activity instance would be useless because its underlying Context would not have been set up.
The rule is that you should never ever create instances of Android components (Activity, Service, BroadcastReceiver, Provider) yourself (using the new keyword or other means). These classes should only ever be created by the Android framework, because Android sets up the underlying Context for these objects and also manages the lifecycle.
I think your newly created activity object can't get actual context. so try to avoid your current flow. I suggest you to create a separate class that may use as factory class and I think your problem will solved.
Or another solution would be like this :
Context context = /*get application context*/
SharedPreferences sharedPref = context.getSharedPreferences(
getString(R.string.preference_file_key), Context.MODE_PRIVATE);
/*get value from this sharedPref*/
So you don't need to create activity class object and here you should avoid your previous getter method to get value.
change you globalfile to be a utility class and not an activity so it can be used really easily by other parts of your app (that aren't an activity but have access to an android context).
public class Global {
private final SharedPreferences sharedpreferences;
public static final String mypreference = "mypref";
public static final String Pwd = "pwdKey";
public static final String Email = "emailKey";
private static String global_username = "null/",
global_pwd = "null/";
public Global(Context context) {
this.sharedpreferences = context.getSharedPreferences(mypreference,
Context.MODE_PRIVATE);
}
public String getusername() {
global_username = sharedpreferences.getString(Email, "null/");
return global_username;
}
public String getuserpwd() {
global_pwd = sharedpreferences.getString(Pwd, "null/");
return global_pwd;
}
public void setusername(String someVariable) {
global_username = someVariable;
sharedpreferences.edit().putString(Email,global_username).commit();
}
public void setuserpwd(String someVariable) {
global_pwd = someVariable;
sharedpreferences.edit().putString(Pwd,global_pwd).commit();
}
}
And here's how to use your new util class
Global global = new Global(context);
global.setusername("foo");
Log.d("TAG", "username from prefs = " + global.getusername());
global.setuserpwd("bar");
Log.d("TAG", "password from prefs = " + global.getusername());
How to save values in preferences (and read) with quite compact way without creating several instances - i want be sure that i have only one instance of pref
A SharedPreferences object is a natural singleton. Your first call to read in a SharedPreferences (e.g., PreferenceManager.getDefaultSharedPreferences()) will create it. Second and subsequent calls within the same process will return that same instance. Hence, so long as you are consistent about where you get your SharedPreferences from, you will only ever have one instance (at most) in your process.
CommonsWare is right, but as i understood, you want somehow to structure you job with Preferences, i use singleton for this, something like this:
public class Preferences {
private static final String USERNAME = "username";
private static final String LOG_TAG = Preferences.class.getSimpleName();
private static Preferences sInstance;
private SharedPreferences mSharedPreferences;
private SharedPreferences.Editor mEditor;
private Context mContext;
private Preferences(Context context) {
mContext = context;
mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
mEditor = mSharedPreferences.edit();
}
public static Preferences getInstance(Context context) {
if (sInstance == null) {
sInstance = new Preferences(context);
}
return sInstance;
}
public void setUsername(String username) {
mEditor.putString(USERNAME, username);
commit();
}
public String getUsername() {
return mSharedPreferences.getString(USERNAME, null);
}
public boolean commit() {
return mEditor.commit();
}
}
And where it is necessary write
Preferences.getInstance(this).setUsername("USERNAME");
and read
Preferences.getInstance(this).getUsername();
I want to get a string from my shared preference file and use for more classes, but I don't know why not work.
My reader class is:
import android.app.Activity;
import android.content.SharedPreferences;
public class A {
public static String url2;
public void execute() {
String URLPref = "URL";
SharedPreferences prefs = getSharedPreferences("com.exam.search_preferences",Activity.MODE_PRIVATE);
url2 = prefs.getString(URLPref , "");
}
private SharedPreferences getSharedPreferences(String string,
int modePrivate) {
return null;
}
}
And the second class that uses the string
public class SearchHome extends Activity {
static String url2;
A cls2= new A();
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.search_activity);
cls2.execute();
url2 = A.url2;
Toast.makeText(getApplicationContext(),"URL:" + url2 ,
Toast.LENGTH_LONG).show();
...
Sorry for my bad english, I never learned.But I'm trying!
You need to pass the Context to your class A, because you can get the SharedPreferences from a Context object. NOTE, an Activity is a Context to some extend
public class A {
public static String url2;
/** #param context used to get the SharedPreferences */
public void execute(Context context) {
String URLPref = "URL";
SharedPreferences prefs = context.getSharedPreferences("com.exam.search_preferences",Activity.MODE_PRIVATE);
url2 = prefs.getString(URLPref , "");
}
}
And then pass the Context to your execute method
public class SearchHome extends Activity {
static String url2;
A cls2= new A();
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.search_activity);
// pass context 'this' to the execute function
// This works, because SearchHome extends Activity
cls2.execute(this);
url2 = A.url2;
...
if your data is not confidential it would be a lot easier if you can make a class specially for shared preference and have other activities access it. you will save a lot of time and code will be a lot simpler to follow up
public class HelperShared {
public static final String score = "Score";
public static final String tag_User_Machine = "tag_User_Machine",
tag_Machine_Machine = "tag_Machine_Machine",
tag_Draw_Machine = "tag_Draw_Machine",
tag_Total_Machine = "tag_Total_Machine";
public static SharedPreferences preferences;
public static Editor editor;
public HelperShared(Context context) {
this.preferences = context.getSharedPreferences(score,
Activity.MODE_PRIVATE);
this.editor = preferences.edit();
}
/*
* Getter and Setter methods for Machine
*/
public void setUserMachine(int UserMachine) {
editor.putInt(tag_User_Machine, UserMachine);
editor.commit();
}
public void setMachineMachine(int MachineMachine) {
editor.putInt(tag_Machine_Machine, MachineMachine);
editor.commit();
}
public void setDrawMachine(int DrawMachine) {
editor.putInt(tag_Draw_Machine, DrawMachine);
editor.commit();
}
public void setTotalMachine(int TotalMachine) {
editor.putInt(tag_Total_Machine, TotalMachine);
editor.commit();
}
public int getUserMachine() {
return preferences.getInt(tag_User_Machine, 0);
}
public int getMachineMachine() {
return preferences.getInt(tag_Machine_Machine, 0);
}
public int getDrawMachine() {
return preferences.getInt(tag_Draw_Machine, 0);
}
public int getTotalMachine() {
return preferences.getInt(tag_Total_Machine, 0);
}
}
private SharedPreferences getSharedPreferences(String string,
int modePrivate) {
return null;
}
problem is here.
return null;
you have to return valid SharedPreferences object. otherwise you will always get NullPointerException.
Call this when you want to put a pref:
putPref("myKey", "mystring", getApplicationContext());
Call this when you want to get a pref:
getPref("myKey", getApplicationContext());
You can use SharedPreferences to save any primitive data: booleans, floats, ints, longs, and strings. This data will persist across user sessions (even if your application is killed).
Different Modes:
1 MODE_APPEND
This will append the new preferences with the already exisiting preferences
2 MODE_ENABLE_WRITE_AHEAD_LOGGING
Database open flag. When it is set , it would enable write ahead logging by default
3 MODE_MULTI_PROCESS
This method will check for modification of preferences even if the sharedpreference instance has already been loaded
4 MODE_PRIVATE
By setting this mode , the file can only be accessed using calling application
5 MODE_WORLD_READABLE
This mode allow other application to read the preferences
6 MODE_WORLD_WRITEABLE
This mode allow other application to write the preferences
Read More
You just need to make shared prefrences object in class where you want to have data
SharedPreferences prefrences = getSharedPreferences("my prefs",MODE_PRIVATE)
Editor editor = prefrences.edit();
String s = edit.getString("your key",value);
hope it helps !