Android - SharedPreferences aren't saving when I restart the app - java

I'm using Android Studio to make a game, and my SharedPreferences which I'm using for a highscore aren't being saved when I reload the app. Within the app it works fine, but restarting sends the highscore back to the default value (0).
Setting my SharedPreferences in MainActivity:
SharedPreferences settings = getSharedPreferences("GAME_DATA", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
if(currentTopic == 4){
if(settings.getInt("HIGHSCORE", 0) < Math.round(scoreTotal)){
editor.clear();
editor.putInt("HIGHSCORE", Math.round(scoreTotal));
editor.apply();
editor.commit();
}
Intent homeIntent = new Intent(MainActivity.this, HomeActivity.class);
homeIntent.putExtra("Score", Integer.toString(Math.round(scoreTotal)));
startActivity(homeIntent);
editor.commit();
finish();
To clarify, the code does make it into the if statement. "scoreTotal" is the highscore which I am saving.
Getting my SharedPreferences in HomeActivity:
SharedPreferences settings = getSharedPreferences("GAME_DATA", Context.MODE_PRIVATE);
int highscore = settings.getInt("HIGHSCORE", 0);
Log.i("highscore", String.valueOf(highscore));
TextView tv_highscore = findViewById(R.id.tv_highscore);
tv_highscore.setText("Highscore: "+String.valueOf(highscore));
Where have I gone wrong?
Please let me know if I have forgotten to include something. I've tried many things from previous StackOverflow posts but to no avail. Thanks in advance.
EDIT: To clarify, my problem came from not being able to do SharedPreferences in that activity then get them from another. I used the intent extra message and did all the SharedPreferences in the HomeActivity and it worked. Hope this is able to help some people.

Try this instead:
SharedPreferences settings = getSharedPreferences("GAME_DATA", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
long score = Math.round(scoreTotal);
if(currentTopic == 4){
if(settings.getInt("HIGHSCORE", 0) < score){
editor.putInt("HIGHSCORE", score);
editor.apply();
}
Intent homeIntent = new Intent(MainActivity.this, HomeActivity.class);
homeIntent.putExtra("Score", Integer.toString(score));
startActivity(homeIntent);
finish();
I suspect that you do not need (or even really want) to call editor.clear(); since this (according the the Google Docs) will
Mark in the editor to remove all values from the preferences
.
And there is no need to call apply and commit one will do:
Google Docs:
Unlike commit(), which writes its preferences out to persistent
storage synchronously, apply() commits its changes to the in-memory
SharedPreferences immediately but starts an asynchronous commit to
disk and you won't be notified of any failures. If another editor on
this SharedPreferences does a regular commit() while a apply() is
still outstanding, the commit() will block until all async commits are
completed as well as the commit itself.

You can make a class for saving data like this
public class GameData {
private SharedPreferences preferences;
private SharedPreferences.Editor editor;
private Context context;
private int PRIVATE_MODE = 0;
private static final String PREF_NAME = "GAME_DATA";
public GameData(Context context){
this.context = context;
preferences = context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
editor = preferences.edit();
}
public void set(String key, boolean value){
editor.putBoolean(key, value);
editor.commit();
}
public void set(String key, String value){
editor.putString(key, value);
editor.commit();
}
public void set(String key, long value){
editor.putLong(key, value);
editor.commit();
}
public void set(String key, int value){
editor.putInt(key, value);
editor.commit();
}
public void set(String key, float value){
editor.putFloat(key, value);
editor.commit();
}
public float get(String key, float defaultValue){
return preferences.getFloat(key, defaultValue);
}
public int get(String key, int defaultValue){
return preferences.getInt(key, defaultValue);
}
public long get(String key, long defaultValue){
return preferences.getLong(key, defaultValue);
}
public String get(String key, String defaultValue){
return preferences.getString(key, defaultValue);
}
public boolean get(String key, boolean defaultValue){
return preferences.getBoolean(key, defaultValue);
}
}
Then call the class to set/get your data
private GameData gamedata;
gamedata = new GameData(getApplicationContext());
gamedata.set("HIGHSCORE",score); // FOR SET THE HIGHSCORE
int highscore = gamedata.get("HIGHSCORE", 0); // FOR GET THE HIGHSCORE

Related

getSharedPreferences Activity to Fragment

I'm trying to save data on Activity and read on the Fragment.
public void saveData() {
SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(kekoyaz,mykey );
editor.apply();
Toast.makeText(this, "Data saved", Toast.LENGTH_SHORT).show();
}
Load data on fragment
public void loadData() {
SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);
//SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getContext());
String beimtext = sharedPreferences.getString(kekoyaz, "");
Toast.makeText(getActivity(), "bu"+beimtext, Toast.LENGTH_SHORT).show();
}
But getSharedPreferences turn red on the fragment and it's suggested to create SharedPreferences method. So I did and there is no error left.
private SharedPreferences getSharedPreferences(String sharedPrefs, int modePrivate) {
return null;
}
I get error when I run the app.
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.prestige.user, PID: 32516
java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.String android.content.SharedPreferences.getString(java.lang.String, java.lang.String)' on a null object reference
at com.prestige.user.BlankFragment.loadData(BlankFragment.java:1918)
at com.prestige.user.BlankFragment.onCreateView(BlankFragment.java:1898)
UPDATE
I removed this line
/*private SharedPreferences getSharedPreferences(String sharedPrefs, int modePrivate) {
return null;
}*/
and I use your code
public void loadData() {
getActivity().getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);
String beimtext = sharedPreferences.getString(kekoyaz);
Toast.makeText(getActivity(), "bu"+beimtext, Toast.LENGTH_SHORT).show();
}
I add
private ResourceBundle sharedPreferences;
But I got an error again.
After you update your question, you getSharedPreferences() with Activity but did't assign sharedPreferences variable value
Replace your code with below.
public void loadData() {
sharedPreferences = getActivity().getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);
String beimtext = sharedPreferences.getString(kekoyaz);
Toast.makeText(getActivity(), "bu"+beimtext, Toast.LENGTH_SHORT).show();
}
This is because getSharedPreferences need a Context.
So, you can use the following:
getActivity().getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);

Sharedpreferences android studio error saving data [duplicate]

This question already has answers here:
How do I compare strings in Java?
(23 answers)
Closed 4 years ago.
I saved my data from an numberDecimal edit text using sharedpreference. When I want to get that data in another activity, it always appears as null, so it wasn't saved correctly. Any suggestion?
This is my code from where I save the data :
public void Start(View view) {
EditText LevelEdit = (EditText) findViewById(R.id.editText_LevelCurrent);
String User_Level = LevelEdit.getText().toString();
if (User_Level == "") {
Toast.makeText(this, "Select a level",
Toast.LENGTH_LONG).show();
} else {
SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString(GameConstants.StringvalueOfLevel,User_Level);
editor.commit();
Intent myIntent = new Intent(Mygame_Menu.this, Mygame.class);
startActivity(myIntent);
}
}
i think your condition is wrong and because of that your saving null object in shared preference don't check the string like this if (User_Level == "")the == operator dose not work on the strings in java ! you should use equals method for comparing to String like this "Amir".equals("Amir")
use this instead if (User_Level==null||User_Level.isEmpty())
You are missing to put sharedPreference name as parameter causes error.
Instead of this
SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
Change
SharedPreferences sharedPref = getApplicationContext().getSharedPreferences("sharedPreferenceName",Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
You can't compare string value with int format in if loop. Change
if(User_Level == "")
To
if(User_Level.equals(""))
So it will check the condition as correct. Otherwise above will execute else part even if its null.
EDITED
private static final String PREFS_NAME = "PREF_LEVEL_DATA";
private static final String PREFS_KEY = "LEVEL";
public void SaveLevel(Context context, String level) {
SharedPreferences settings = context.getSharedPreferences(PREFS_NAME,
Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putString(PREFS_KEY, level);
editor.commit();
}
public String RetrieveLevel(Context context) {
String level;
SharedPreferences settings = context.getSharedPreferences(PREFS_NAME,
Context.MODE_PRIVATE);
if (settings.contains(PREFS_KEY)) {
level = settings.getString(PREFS_KEY, "");
} else {
return "";
}
return level;
}
For store a value
SaveLevel(getApplicationContext(), User_Level);
For retreive a value
String level = RetreiveLevel(getApplicationContext());
UPDATED
EditText LevelEdit = (EditText) findViewById(R.id.editText_LevelCurrent);
String User_Level = LevelEdit.getText().toString();
if (User_Level.equals("")) {
Toast.makeText(this, "Select a level",
Toast.LENGTH_LONG).show();
} else {
SharedPreferences sharedPref = getSharedPreferences("ANY_PREFERENCE_NAME",
Context.MODE_PRIVATE); //Replace "ANY_PREFERENCE_NAME" as your own string
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString(GameConstants.StringvalueOfLevel,User_Level);
editor.commit();
Intent myIntent = new Intent(Mygame_Menu.this, Mygame.class);
startActivity(myIntent);
}

How to use shared preferences to save data that get from database? [duplicate]

This question already has answers here:
Shared preferences for creating one time activity
(14 answers)
How to use SharedPreferences in Android to store, fetch and edit values [closed]
(30 answers)
Closed 6 years ago.
I have this button code and it was connect to database
bLogin.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
final String username = etUsername.getText().toString();
final String password = etPassword.getText().toString();
// Response received from the server
Response.Listener<String> responseListener = new Response.Listener<String>() {
#Override
public void onResponse(String response) {
try {
JSONObject jsonResponse = new JSONObject(response);
boolean success = jsonResponse.getBoolean("success");
if (success) {
String name = jsonResponse.getString("name");
String email = jsonResponse.getString("email");
String alamat = jsonResponse.getString("alamat");
int notelp = jsonResponse.getInt("notelp");
String username = jsonResponse.getString("username");
String password = jsonResponse.getString("password");
Intent intent = new Intent(MainActivity.this, adminarea.class);
intent.putExtra("name", name);
intent.putExtra("email", email);
intent.putExtra("alamat", alamat);
intent.putExtra("notelp", notelp);
intent.putExtra("username", username);
intent.putExtra("password", password);
MainActivity.this.startActivity(intent);
} else {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setMessage("Login Gagal")
.setNegativeButton("Ulangi", null)
.create()
.show();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
};
i have a table called admin thats contain field name, email and etc.. how can i take the data from databse then save my data like name, email, alamat and the other to shared prefences. then can you help me to call it to another activity?
First of all you have to create SharedPreferences
SharedPreferences pref = getApplicationContext().getSharedPreferences("YOUR_PREF_NAME", MODE_PRIVATE);
Editor edt = pref.edit();
To add value in preference:
edt.putString("name", name);
edt.putString("email", email);
edt.putString("alamat", alamat);
edt.putString("notelp", notelp);
edt.putString("username",username);
// Save your changes
edt.commit();
Now for getting data from preference:
String name=pref.getString("name", null);
String email=pref.getString("email", null);
String alamat=pref.getString("alamat", null);
String notelp=pref.getString("notelp", null);
String username=pref.getString("username", null);
If you want to clear the preference data:
edt.clear();
edt.commit();
Save like below.
SharedPreferences getPref = PreferenceManager.getDefaultSharedPreferences(this);
Intent intent = new Intent(MainActivity.this, adminarea.class);
intent.putExtra("name", name);
getPref.edit().putString("name",name).apply();
intent.putExtra("email", email);
getPref.edit().putString("email",name).apply();
intent.putExtra("alamat", alamat);
getPref.edit().putString("alamat",name).apply();
intent.putExtra("notelp", notelp);
intent.putExtra("username", username);
intent.putExtra("password", password);
MainActivity.this.startActivity(intent);
Retrieve like this.
SharedPreferences getPref = PreferenceManager.getDefaultSharedPreferences(this);
String name = getPref.getString("name","");
String email = getPref.getString("email","");
String alamat = getPref.getString("alamat","");
Create a class SharePrefUtil
private Context context;
private SharedPreferences prefs;
public SharePrefUtil(Context mContext) {
this.context = mContext;
prefs = this.context.getSharedPreferences("your package name", Context.MODE_PRIVATE);
}
public void setValueInSharePref(String keyName, String value) {
prefs.edit().putString(keyName, value).apply();
}
public String getValueFromSharePref(String keyName) {
return prefs.getString(keyName, "");
}
}
When ever you want to store the value
Just Make a object of class in you activity to get or set a value
for example
SharePreUtil shef = new SharePreUtil(this);
When ever you what to set a value in the activity
shef.setValueInSharePref("key", "yourvalue");
when you want to get value
shef.getValueFromSharePref("key");
All the best...
onCreate() method
sharedpreferences = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
to get all data server after
SharedPreferences.Editor editor = sharedpreferences.edit();
editor.putString(name, name);
editor.putString(email, email);
.....
editor.commit();
quoting the training guide at https://developer.android.com/training/basics/data-storage/shared-preferences.html
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt(getString(R.string.saved_high_score), newHighScore);
editor.commit();
and to read
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
int defaultValue = getResources().getInteger(R.string.saved_high_score_default);
long highScore = sharedPref.getInt(getString(R.string.saved_high_score), defaultValue);
In your other activity....first receive data from intent...like this
String name = getIntent().getExtras().getInt("name");
now,save this data into shared prefrences....to do that...you need sharedPreferences.Editor to write data.....like this...
SharedPreferences sp = Your_Activity.this.getSharedPreferences("SharedPreferences_Name", Context.MODE_PRIVATE);
SharedPreferences.Editor spwriter = sp.edit();
spwriter.putString("name",name);
spwriter.commit();
if (success) {
// once you retrieve all the required data
SharedPreferences prefs = this.getSharedPreferences("com.example.app", Context.MODE_PRIVATE);
// Writing data to SharedPreferences
Editor editor = prefs.edit();
editor.putString("name", name);
editor.putString("email", email);
editor.putInt("notelp", notelp);
editor.commit();
// start your AdminArea activity here
}
Retrieve data inn AdminArea class:
// Reading from SharedPreferences
String value = prefs.getString("name", "DEFAULT_STRIGN"); // if the given key not found, it'll take the default string as value
int intValue = prefs.getInt("notelp", -1); // instead of -1, you can give any default value
hope this helps :)
You can save data in SharedPreferences in your activity class as below:
SharedPreferences sharedPreferences = getSharedPreferences("USER_INFO", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("name", name);
editor.putString("email", alamat);
editor.putString("alamat", alamat);
editor.commit();
And in your activity where you want to fetch them, do as below:
SharedPreferences sharedPreferences = getSharedPreferences("USER_INFO", Context.MODE_PRIVATE);
String name=sharedPreferences.getString("name", "abc");
String email=sharedPreferences.getString("email", "abc#gmail.com");
To put int,
editor.putInt("number",0);
And to retrive it,
sharedPreferences.getInt("number",0);

sharedPreferences.getString() return null

Im trying to display the user email in a textView using SharedPreferences.
Shared preferences is created in loginActivity.
I try to access it from mainActivity.
My session using sharedPreference work well (with a login boolean saved in sharedPreferences files).
So what's wrong?
- A context error?
- Because I try to access the data from an another activity?
Please help :) Thanks a lot!
Here is the code im using :
Login Activity :
#Override
protected void onResume() {
super.onResume();
//In onresume fetching value from sharedpreference
SharedPreferences sharedPreferences = getSharedPreferences(Config.SHARED_PREF_NAME,Context.MODE_PRIVATE);
//Fetching the boolean value form sharedpreferences
loggedIn = sharedPreferences.getBoolean(Config.LOGGEDIN_SHARED_PREF, false);
//If we will get true
if(loggedIn){
//We will start the Profile Activity
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
}
}
...
//Creating a shared preference in a login()
SharedPreferences sharedPreferences = getSharedPreferences(Config.SHARED_PREF_NAME, Context.MODE_PRIVATE);
//Creating editor to store values to shared preferences
SharedPreferences.Editor editor = sharedPreferences.edit();
//Adding values to editor
editor.putBoolean(Config.LOGGEDIN_SHARED_PREF, true);
editor.putString(Config.EMAIL_SHARED_PREF, email);
//Saving values to editor
editor.commit();
...
Main Activity :
#Override
protected void onResume() {
super.onResume();
//In onresume fetching value from sharedpreference
SharedPreferences sharedPreferences = getSharedPreferences(Config.SHARED_PREF_NAME,Context.MODE_PRIVATE);
//Fetching the boolean value form sharedpreferences
email_session = sharedPreferences.getString(Config.EMAIL_SHARED_PREF, "Private");
usernameText.setText(email_session);
}
to read the stored preferences you need to do:
to save
SharedPreferences spref = getSharedPreferences("your_prefs_name", Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = spref.edit();
editor.putString("myTextViewValue", prefVal); //
editor.commit();
to read it
SharedPreferences preferences = getPreferences(Activity.MODE_PRIVATE);
String storedPreference = preferences.getStr("myTextViewValue", null);
This happens because your value is not stored in the shared preferences.
SharedPreferences pref = getSharedPreferences("your Pref Name", 0) // 0 for Private Mode
String name = pref.getString("your key store when login", null); // null is the default value you can put it here "No value". then you will not get null pointer.

SharedPreferences not working as expected, cannot read nor write preferences

private void init() {
SharedPreferences prefs = getSharedPreferences("data", Context.MODE_PRIVATE);
// SET VALUE RECORD
record = prefs.getInt("record", 0);
prefs.edit().commit();
}
private void setRecord(int i ) {
SharedPreferences prefs = getSharedPreferences("data", Context.MODE_PRIVATE);
if(i > prefs.getInt("record", 0))
prefs.edit().putInt("record", i);
prefs.edit().commit();
}
private int getRecord() {
int rec;
SharedPreferences prefs = getSharedPreferences("data", Context.MODE_PRIVATE);
rec = prefs.getInt("record", 0);
prefs.edit().commit();
Toast toast = Toast.makeText(this, rec+"", Toast.LENGTH_SHORT);
toast.show();
return rec;
}
this code should set an int and retrieve it, but it doesn't seem to ever set it... can you see why is that?
Think it is best to call the interface SharedPreferences.Editor to edit preferences instead of using prefs.edit().putInt("record", i);. The docs say...
Modifications to the preferences must go through an
SharedPreferences.Editor object to ensure the preference values remain
in a consistent state and control when they are committed to storage.
If you change your setMethod to the following it should work...
private void setRecord(int i ) {
SharedPreferences prefs = getSharedPreferences("data", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
if(i > prefs.getInt("record", 0))
editor.putInt("record", i);
editor.commit();
}
And I guess you are calling the above method setRecord somewhere in your code as I can't see it being called anywhere in the code snippet you pasted.
try
Editor editor = prefs.edit();
editor.putInt("record",i);
editor.commit();

Categories

Resources