SharedPreferences.getBoolean возвращает true каждый раз

Я создал класс для обработки важных изменений данных, таких как статус покупки приложений и другие вещи.

Для этой цели я создал класс, который выполняет настройку и чтение значений. но проблема возникает всякий раз, когда я вызываю метод appIsPurchased(), результат является истинным, пока он не был изменен с момента установки приложения и его первого начального запуска.

Это мой код:

/**
 * 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;
    }

}


Вопрос 1: что-то не так с моим кодом? если есть тогда, почему appIsPurchased() всегда возвращает true?

Вопрос 2: все ли значения в общих предпочтениях являются истинными по умолчанию?

Между тем, когда я использую этот класс в своем коде, тост "Купил!" запускается, даже когда приложение работает в первый раз.

@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();
        }
}

Ответ 1

Найдено, проблема в том, что я думал

settings.getBoolean(keyPurchase,false) 

возвращает значение переменной keyPurchased, но факт заключается в том, что она возвращает только переменную, а не ее значение, поэтому я исправил проблему, изменив метод моего класса на это:

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

Ответ 2

На самом деле в вашем коде есть проблема! вот почему его всегда показывали купленные!!

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

в этих строках, если тег keyPurchased, если он не используется, u передает истинное значение по умолчанию поэтому, когда u вызывает

if (appCore.appIsPurchased()){

он всегда возвращает истинное значение. Решение состоит в том, что убедитесь, что значения предпочтений установлены до того, как вы их вызовете.. надеюсь, что это поможет

Ответ 3

вы устанавливаете значение по умолчанию равным true, поэтому либо ваша sharedpreference не содержит запись для key_purchased, либо setAppInPurchasedMode никогда не вызывается или не называется wit status successful. На второстепенной стороне ваш

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

может быть реализовано как:

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

about setAppInPurchasedMode, если бы я был в вас, я бы изменил способ сравнения status, следующим образом:

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();
        }

    } 

разница заключается в том, что если status равно null, то способ, которым вы были внедрены, приведет к краху вашего приложения с помощью NPE. С моей реализацией вы получите false, потому что "successful" instanceof null всегда false, а instanceof - первая проверка для equals

Ответ 4

Для тех, у кого по-прежнему возникает проблема, не забудьте применить изменения к вашим предпочтениям.

 private SharedPreferences sharedPreferences ;
 private SharedPreferences.Editor sharedPreferencesEditor;

 sharedPreferencesEditor.putBoolean("myVariable", false);
 sharedPreferencesEditor.apply();