我想在登录页面中保存一个值,之后可以在其他片段中使用。为此,我使用了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;
}
提前谢谢!
答案 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()
;