SharedPreferences.getBoolean每次都返回true

时间:2014-05-29 13:33:39

标签: android sharedpreferences

我创建了一个类来处理重要的数据更改,例如App Purchase Status和其他内容。

为了实现这个目标,我创建了一个用于设置和读取值的类。但问题是每当我调用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:默认情况下,共享首选项中的所有值都是真的吗?


同时,当我在我的代码中使用这个类时,toast&#34;已购买!&#34;即使应用程序第一次运行,也会运行。

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

4 个答案:

答案 0 :(得分:7)

找到它,问题在于我在想

settings.getBoolean(keyPurchase,false) 

返回keyPurchased变量的值,但事实是它只返回变量本身而不是它的值,所以我通过将类的方法改为此来解决问题:

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

答案 1 :(得分:5)

实际上您的代码存在问题!这就是为什么它总是显示购买!!

 if (settings.getBoolean(keyPurchase,true)){
            purchased = true;
        }
如果未使用keyPurchased标记,则在此行中

,默认情况下,您传递的是true值 所以当你打电话

if (appCore.appIsPurchased()){

它总是返回一个真值。解决方法是确保在调用它们之前设置首选项值..希望这有帮助

答案 2 :(得分:4)

您将默认值设置为true,因此您的共享首选项不包含key_purchased的条目,或者setAppInPurchasedMode从未被调用或称为机智状态successful。在次要方面,你的

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

可以像:

一样实现
public boolean appIsPurchased(){
       return settings.getBoolean(keyPurchase, false);
 }

关于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,您实施的方式将使您的应用程序崩溃。通过我的实施,您将得到错误,因为"successful" instanceof null始终为false,而instanceofequals的第一次检查

答案 3 :(得分:3)

对于仍有问题的人,请记住将更改应用于您的偏好。

 private SharedPreferences sharedPreferences ;
 private SharedPreferences.Editor sharedPreferencesEditor;

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