使用SharedPreferences保存登录数据,但是只能保存一个
Use SharedPreferences to save login data, but it jsut can only save one
我已经使用 SharedPreferences 来保存登录数据喜欢记住我,
而且我设置了三个按钮,里面有保存,清除,读取功能,
但是我保存了一次登录数据后,我就不能再更新保存信息了,
顺便说一句,我已经设置了一个复选框来保存数据
但看起来效果不佳..
有人可以帮我解决这个问题吗?
这是我的代码:
package com.example.escanui;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.MultiAutoCompleteTextView;
public class UserInfoActivity extends ActionBarActivity {
public MultiAutoCompleteTextView userName;
public MultiAutoCompleteTextView ipAddress;
public Button loginConfirmBtw;
public EditText passWord;
public CheckBox memUserInfoCb;
public Button save, read, clear;
private SharedPreferences settings;
private static final String data = "DATA";
public static final String nameField ="NAME";
public static final String passwordField = "PASSWORD";
public static final String ipField = "IP";
public static final String filePathFile ="FILEPATH";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user_info);
ipAddress = (MultiAutoCompleteTextView) findViewById(R.id.multiAutoCompleteTextView1);
userName = (MultiAutoCompleteTextView) findViewById(R.id.multiAutoCompleteTextView2);
passWord = (EditText) findViewById(R.id.editPassword1);
loginConfirmBtw = (Button) findViewById(R.id.loginButton);
memUserInfoCb = (CheckBox) findViewById(R.id.checkBox1);
save = (Button) findViewById(R.id.saveBtw);
read = (Button) findViewById(R.id.readBtw);
clear = (Button) findViewById(R.id.clearBtw);
setEventListener();
if (memUserInfoCb.isChecked())
{
saveUserInfo();
readData();
}else{
ipAddress.setText("");
userName.setText("");
passWord.setText("");
}
}
public void readData()
{
settings = getSharedPreferences(data,0);
userName.setText(settings.getString(nameField, ""));
ipAddress.setText(settings.getString(ipField, ""));
passWord.setText(settings.getString(passwordField, ""));
}
public void saveUserInfo()
{
settings = getSharedPreferences(data, 0);
settings.edit().putString(ipField, ipAddress.getText().toString());
settings.edit().putString(nameField, userName.getText().toString());
settings.edit().putString(passwordField, passWord.getText().toString());
settings.edit().commit();
}
public void setEventListener(){
save.setOnClickListener(new OnClickListener(){
public void onClick(View arg0) {
saveUserInfo();
}
});
read.setOnClickListener(new OnClickListener(){
public void onClick(View arg0) {
readData();
}
});
clear.setOnClickListener(new OnClickListener(){
public void onClick(View arg0) {
ipAddress.setText("");
userName.setText("");
passWord.setText("");
}
});
}
}
您的问题是在保存数据时
每次调用 settings.edit()
时,都会创建一个新的 Editor
对象。
当您调用 editor.commit()
或 editor.apply()
时,您将写入对编辑器对象所做的所有更改。
因此,在您的代码中,每次调用 settings.edit()
时都会创建 4 个 Editor
对象
settings.edit().putString(ipField, ipAddress.getText().toString());
settings.edit().putString(nameField, userName.getText().toString());
settings.edit().putString(passwordField, passWord.getText().toString());
settings.edit().commit();
只有最后一个 settings.edit()
被提交,但您没有对该 Editor
对象进行任何更改,因此您没有提交任何内容。
考虑一下
public void saveUserInfo()
{
settings = getSharedPreferences(data, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putString(ipField, ipAddress.getText().toString());
editor.putString(nameField, userName.getText().toString());
editor.putString(passwordField, passWord.getText().toString());
editor.commit();
}
我已经使用 SharedPreferences 来保存登录数据喜欢记住我,
而且我设置了三个按钮,里面有保存,清除,读取功能,
但是我保存了一次登录数据后,我就不能再更新保存信息了,
顺便说一句,我已经设置了一个复选框来保存数据
但看起来效果不佳..
有人可以帮我解决这个问题吗?
这是我的代码:
package com.example.escanui;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.MultiAutoCompleteTextView;
public class UserInfoActivity extends ActionBarActivity {
public MultiAutoCompleteTextView userName;
public MultiAutoCompleteTextView ipAddress;
public Button loginConfirmBtw;
public EditText passWord;
public CheckBox memUserInfoCb;
public Button save, read, clear;
private SharedPreferences settings;
private static final String data = "DATA";
public static final String nameField ="NAME";
public static final String passwordField = "PASSWORD";
public static final String ipField = "IP";
public static final String filePathFile ="FILEPATH";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user_info);
ipAddress = (MultiAutoCompleteTextView) findViewById(R.id.multiAutoCompleteTextView1);
userName = (MultiAutoCompleteTextView) findViewById(R.id.multiAutoCompleteTextView2);
passWord = (EditText) findViewById(R.id.editPassword1);
loginConfirmBtw = (Button) findViewById(R.id.loginButton);
memUserInfoCb = (CheckBox) findViewById(R.id.checkBox1);
save = (Button) findViewById(R.id.saveBtw);
read = (Button) findViewById(R.id.readBtw);
clear = (Button) findViewById(R.id.clearBtw);
setEventListener();
if (memUserInfoCb.isChecked())
{
saveUserInfo();
readData();
}else{
ipAddress.setText("");
userName.setText("");
passWord.setText("");
}
}
public void readData()
{
settings = getSharedPreferences(data,0);
userName.setText(settings.getString(nameField, ""));
ipAddress.setText(settings.getString(ipField, ""));
passWord.setText(settings.getString(passwordField, ""));
}
public void saveUserInfo()
{
settings = getSharedPreferences(data, 0);
settings.edit().putString(ipField, ipAddress.getText().toString());
settings.edit().putString(nameField, userName.getText().toString());
settings.edit().putString(passwordField, passWord.getText().toString());
settings.edit().commit();
}
public void setEventListener(){
save.setOnClickListener(new OnClickListener(){
public void onClick(View arg0) {
saveUserInfo();
}
});
read.setOnClickListener(new OnClickListener(){
public void onClick(View arg0) {
readData();
}
});
clear.setOnClickListener(new OnClickListener(){
public void onClick(View arg0) {
ipAddress.setText("");
userName.setText("");
passWord.setText("");
}
});
}
}
您的问题是在保存数据时
每次调用 settings.edit()
时,都会创建一个新的 Editor
对象。
当您调用 editor.commit()
或 editor.apply()
时,您将写入对编辑器对象所做的所有更改。
因此,在您的代码中,每次调用 settings.edit()
Editor
对象
settings.edit().putString(ipField, ipAddress.getText().toString());
settings.edit().putString(nameField, userName.getText().toString());
settings.edit().putString(passwordField, passWord.getText().toString());
settings.edit().commit();
只有最后一个 settings.edit()
被提交,但您没有对该 Editor
对象进行任何更改,因此您没有提交任何内容。
考虑一下
public void saveUserInfo()
{
settings = getSharedPreferences(data, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putString(ipField, ipAddress.getText().toString());
editor.putString(nameField, userName.getText().toString());
editor.putString(passwordField, passWord.getText().toString());
editor.commit();
}