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

标签 java android android-studio sharedpreferences

我想在登录页面中保存一个值,以便以后可以在其他 fragment 中使用。为此,我使用了sharedPreferences并可以存储“用户名”,这是代码:

登录.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");
        }
    }
});

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

编辑个人.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! 我打印了日志,我明白了 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;
}

提前谢谢您!

最佳答案

我认为您正在使用两个同名的变量 puser ,其中一个是全局的,另一个是本地的,,只需确定这是否正确,,如果不是,则显示类 EditPersonal.java 的完整代码

关于java - 在Android中通过sharedPreferences在类之间传递值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34436301/

相关文章:

java - 如何使用 Android 后退按钮在我的应用程序中返回而不是关闭我的应用程序?

android - 删除图标但在 ActionBar 中有 HomeAsUp

java - 关闭应用程序直到特定日期

android-studio - 在android studio中找不到文件资源管理器

android - 无限磁盘缓存在图像加载器 1.9.5 中不起作用

java - 如何替换字符串中两个子字符串中的文本?

java - 使用扫描仪查找信件

java - 强制 eclipse 忽略 "COUNTRY_ISO cannot be resolved or is not a field' 错误并编译

java - 在 Java 中将 String 转换为 CharSequence 或 char[] (Android 1.6 API)

java - 关闭H2数据库;压缩还是碎片整理?