【问题标题】:Cannot Save and Retrieve Data from SharedPreferences in Android无法从 Android 中的 SharedPreferences 保存和检索数据
【发布时间】:2016-04-30 23:46:56
【问题描述】:

我无法使用 SharedPreferences 保存和检索数据... 在我将数据库添加到此之前,此应用运行良好..

我不明白应该将什么传递给 shared Preference 的第二个参数。 getString("key","value"); .. 值是否必须与我在 putString 方法中传递的值相同?

这是我的代码..

public class MainActivity extends Activity {
    TextView lbl;
    EditText uName, uPass;
    String name, pass;
    SharedPreferences sr = getSharedPreferences("mp", MODE_PRIVATE);
    SharedPreferences.Editor et = sr.edit();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        lbl = (TextView) findViewById(R.id.My_Label);
        uName = (EditText) findViewById(R.id.userTxt);
        uPass = (EditText) findViewById(R.id.passTxt);

    }

    //Register Method
    public void doRegister(View v) {

        if ((uName.getText().toString().equals("") && ((uPass.getText().toString()).equals(""))))
            Toast.makeText(this, "Enter UserName and Password First to Get Registered", Toast.LENGTH_LONG).show();

        else {
            name = uName.getText().toString();
            pass = uPass.getText().toString();

            //Save the user to the DataBase


            et.putString("Name",name);
            et.putString("Pswd",pass);
            et.commit();

            //Alert user
            Toast.makeText(this, "User Successfully Registered !", Toast.LENGTH_LONG).show();

            //Clear Login and pass field
            uName.setText("");
            uPass.setText("");
        }
    }


    //Login Method
    public void doLogin(View v) {

        if ((uName.getText().toString().equals("") && ((uPass.getText().toString()).equals("")))) {
            Toast.makeText(this, "Enter UserName and Password First", Toast.LENGTH_LONG).show();

        }

        //User Authenticated
        else if ((uName.getText().toString().equals(sr.getString("Name", name)) && ((uPass.getText().toString()).equals(sr.getString("Pswd", pass))))) {

            Intent it = new Intent(this, SecActivity.class);
            it.putExtra("user", name);
            startActivity(it);
        } else if (!((uName.getText().toString().equals(sr.getString("Name",name)) && !((uPass.getText().toString()).equals(sr.getString("Pswd",pass))))))
            Toast.makeText(this, "Wrong UserName or Password !", Toast.LENGTH_LONG).show();

        //Clears input
        uName.setText("");
        uPass.setText("");

    }

}

【问题讨论】:

  • 您在哪里从共享偏好中检索文本?
  • @helldawg13 这里:if ((uName.getText().toString().equals(sr.getString("Name",name)
  • 顺便说一句。在首选项文件中仅存储纯文本密码只是一个恶作剧。使用 SQLLite DB 和密码加密以获得更好的结果。任何拥有根设备的人都可以看到您保存的密码...

标签: android sharedpreferences


【解决方案1】:

我建议您将代码更改为:

private SharedPreferences sr;
private SharedPreferences.Editor et;

将值保存到 sharedPrefs。

public void doRegister(View v) {

        if ((uName.getText().toString().equals("") && ((uPass.getText().toString()).equals(""))))
            Toast.makeText(this, "Enter UserName and Password First to Get Registered", Toast.LENGTH_LONG).show();

        else {
            name = uName.getText().toString();
            pass = uPass.getText().toString();

            //Save the user to the DataBase

            sr = getSharedPreferences("mp", MODE_PRIVATE);
            sr.edit();
            et.putString("Name",name);
            et.putString("Pswd",pass);
            et.apply();

            //Alert user
            Toast.makeText(this, "User Successfully Registered !", Toast.LENGTH_LONG).show();

            //Clear Login and pass field
            uName.setText("");
            uPass.setText("");
        }
    }

从 sharedPrefs 中检索值:

//Login Method
    public void doLogin(View v) {
        sr = getSharedPreferences("mp", MODE_PRIVATE)
        //You should put a default value in case the key does not 
        //exist so in our case an empty String.
        String nameFromPrefs = sr.getString("Name", "");
        String passFromPrefs = sr.getString("Pswd", "");

        if ((uName.getText().toString().equals("") && ((uPass.getText().toString()).equals("")))) {
            Toast.makeText(this, "Enter UserName and Password First", Toast.LENGTH_LONG).show();

        }

        //User Authenticated
        else if (uName.getText().toString().equals(nameFromPrefs) && (uPass.getText().toString().equals(passFromPrefs)) {

            Intent it = new Intent(this, SecActivity.class);
            it.putExtra("user", name);
            startActivity(it);
        } else if (!uName.getText().toString().equals(nameFromPrefs) && !uPass.getText().toString().equals(passFromPrefs))
            Toast.makeText(this, "Wrong UserName or Password !", Toast.LENGTH_LONG).show();

        //Clears input
        uName.setText("");
        uPass.setText("");

    }

希望对你有帮助!!!

【讨论】:

  • 当我点击注册时它崩溃了..在这里查看 logcat pastebin.com/YLtTQ4xA
  • 你是按照我的方法做的吗?因为 sharedPreferences 可以在 onCreate 之后调用,而您之前已经调用过它们
  • 通过添加这一行解决了它 et = sr.edit(); ...感谢您的帮助
猜你喜欢
  • 2018-06-03
  • 1970-01-01
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-08
  • 2013-08-10
相关资源
最近更新 更多