SharedPreferences.getBoolean returns true everytime
Asked Answered
O

4

9

I made a class for handling important data changes such as App Purchase Status and other stuff .

For this goal I have created a class which does the setting and reading of the values. but the problem is whenever I call the appIsPurchased() method, the result is true while it hasen't been changed since app installation and its first initial launch.

This is my code:

/**
 * Created by neemasa on 5/29/14.
 * This class handles more crucial data values within app.
 */
public class AppCore {

    private SharedPreferences settings;
    private String keyPurchase = "app_purchased";
    private Context context;

    public AppCore(Context context){
        this.context = context;
        settings = PreferenceManager.getDefaultSharedPreferences(context);
    }

    public void setAppInPurchasedMode(String status){
        if (status.equals("successful")){
            settings.edit().putBoolean(keyPurchase, true).commit();
        }else if (status.equals("failed")){
            settings.edit().putBoolean(keyPurchase, false).commit();
        }

    }
    public boolean appIsPurchased(){
        boolean purchased = false;
        if (settings.getBoolean(keyPurchase,true)){
            purchased = true;
        }
        return purchased;
    }

}


Question 1st: is there something wrong with my code? if there is then why appIsPurchased() always return true?
Question 2nd: do all values in the shared preferences are true by default?

Meanwhile when I use this class in my code the toast "Purchased!" runs even when app is running for the first time.

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        AppCore appCore = new AppCore(getApplicationContext());
        if (appCore.appIsPurchased()){
            Toast.makeText(getApplicationContext(),"Purchased!",Toast.LENGTH_SHORT).show();
        }else {
            Toast.makeText(getApplicationContext(),"Not Purchased!",Toast.LENGTH_SHORT).show();
        }
}
Offstage answered 29/5, 2014 at 13:33 Comment(0)
O
5

Found It, the problem is that I was thinking

settings.getBoolean(keyPurchase,false) 

returns the value of keyPurchased variable but the fact is it only returns the variable itself not its value so I fixed the problem by changing the method of my class to this:

public boolean appIsPurchased(){
    return settings.getBoolean(keyPurchase,false);
}
Offstage answered 29/5, 2014 at 13:46 Comment(1)
I don't get how this is the answer, or how it has 7 upvotes. The two snippets of code you provide here are identically. As everyone else has already pointed out, the bug was you had true as your second argument, and not false.Antagonistic
P
7

Actually there is a problem in your code!! thats why its always showing purchased!!

 if (settings.getBoolean(keyPurchase,true)){
            purchased = true;
        }

in this lines if the keyPurchased tag if not used , u are passing true value by default so when u call

if (appCore.appIsPurchased()){

it always return a true value.. The solution is that make sure that the preference values are set before u call them.. hope this helps

Picco answered 29/5, 2014 at 14:9 Comment(0)
O
5

Found It, the problem is that I was thinking

settings.getBoolean(keyPurchase,false) 

returns the value of keyPurchased variable but the fact is it only returns the variable itself not its value so I fixed the problem by changing the method of my class to this:

public boolean appIsPurchased(){
    return settings.getBoolean(keyPurchase,false);
}
Offstage answered 29/5, 2014 at 13:46 Comment(1)
I don't get how this is the answer, or how it has 7 upvotes. The two snippets of code you provide here are identically. As everyone else has already pointed out, the bug was you had true as your second argument, and not false.Antagonistic
A
4

you are setting the default value to true, so either your sharedpreference does not contains an entry for key_purchased or setAppInPurchasedMode is never called or is called wit status successful. On the minor side, your

 public boolean appIsPurchased(){
        boolean purchased = false;
        if (settings.getBoolean(keyPurchase,true)){
            purchased = true;
        }
        return purchased;
    }

can be implemented like:

public boolean appIsPurchased(){
       return settings.getBoolean(keyPurchase, false);
 }

about setAppInPurchasedMode, if I were in you I would change the way you compare status, this way:

public void setAppInPurchasedMode(String status){
        if ("successful".equals(status)){
            settings.edit().putBoolean(keyPurchase, true).commit();
        } else if ("failed".equals(status)){
            settings.edit().putBoolean(keyPurchase, false).commit();
        }

    } 

the difference is that if status is null, the way you implemented will crash your application with NPE. With my implementation you'll get false, because "successful" instanceof null is always false, and instanceof is the first check for equals

Arnoldarnoldo answered 29/5, 2014 at 13:53 Comment(0)
S
4

For those still having a problem, remember to apply the changes to your preferences.

 private SharedPreferences sharedPreferences ;
 private SharedPreferences.Editor sharedPreferencesEditor;

 sharedPreferencesEditor.putBoolean("myVariable", false);
 sharedPreferencesEditor.apply();
Syllabize answered 17/5, 2017 at 15:2 Comment(1)
sharedPreferences.commit(); will also have the same outcomeYale

© 2022 - 2024 — McMap. All rights reserved.