通过Android中的sharedPreferences在类之间传递值

时间:2015-12-23 13:00:54

标签: java android android-studio sharedpreferences

我想在登录页面中保存一个值,之后可以在其他片段中使用。为此,我使用了sharedPreferences并可以存储"用户名",这里是代码:

Login.java

btnl.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        // get The User name and Password
        String userName=un.getText().toString();
        String password=pa.getText().toString();
        String PATIENTID="";

        // fetch the Password form database for respective user name
        String storedPassword=demoCRUD.getSingleEntry_Username(userName);

        // check if the Stored password matches with  Password entered by user
        if(password.equals(storedPassword)) {
            show("Welcome!");
            SharedPreferences userDetails = getContext().getSharedPreferences("userdetails", Context.MODE_PRIVATE);
            Editor edit = userDetails.edit();
            edit.clear();
            edit.putString("_user", userName.trim());
            edit.apply();
            Intent intentLogin=new Intent(getActivity(),Welcome.class);
            startActivity(intentLogin);
        }
        else {
            show("User Name or Password does not match");
        }
    }
});

此外,我可以使用以下代码使用其他片段中的sharedPreferences再次获取该值:

EditPersonal.java

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ep_demoCRUD = new DemographicsCRUD(getActivity());
    SharedPreferences userDetails = getContext().getSharedPreferences("userdetails", Context.MODE_PRIVATE);
    String puser = userDetails.getString("_user", "");
    show("puser = " + puser); *SHOWS ME IT HAS A STRING INSIDE
}

同样在" EditPersonal.java"我有这段代码调用来自不同类的方法:

protected Long doInBackground(Void... arg0) {
    return ep_demoCRUD.UpdateDemographics(ep_demoId,puser);
}

问题是当" EditPersonal.java"的onCreate方法时跑," puser"其值等于Login.java中的用户名,但一旦" doInBachground"调用方法" ep_demoCRUD.UpdateDemographics(ep_demoId,puser);"它通过null! 我打印了Log,我理解了puser = null。 我无法理解这是什么问题?为什么" null"在已经有值的情况下通过了吗?

p.s方法UpdateDemographics定义如下:

public long UpdateDemographics(Demographics_to demoId,String us) {
    SQLiteDatabase db = dbHelper.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(DataBaseHelper.lastName, demoId.getD_lastName());
    values.put(DataBaseHelper.firstName, demoId.getD_firstName());
    values.put(DataBaseHelper.dateOfBirth, demoId.getD_dateOfBirth());

    Log.d("puser","=" +us); * NULL IS PRINTED IN LOG*

    long result = database.update(dbHelper.Demographics_Table,values,"username = ?" , new String[]{us});
    Log.d("Update Result:", "=" + result);
    db.close();
    return result;
}

提前谢谢!

3 个答案:

答案 0 :(得分:1)

我认为你正在使用同名puser的两个变量,其中一个是全局的,另一个是Local,只是确保ifs是否真实,如果没有则告诉我类EditPersonal.java的完整代码

答案 1 :(得分:1)

doInBackground(Void... arg0){}

你没有在AsyncTask中给出puser变量。为什么不?是一个全球变种?

尝试使用AsyncTask提供puser var。

doInBackground(String... puser) {
 return ep_demoCRUD.UpdateDemographics(ep_demoId,puser);
}

你可以发布整个AsyncTask以及定义 puser 的位置吗?

答案 2 :(得分:-1)

您为什么使用editor.clear()?如果您要存储,请将editor.clear()替换为editor.commit();