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