Android数据存储之SharedPreferences使用

时间:2022-03-14 05:30:12

SharedPreferences是Android中一种轻型的数据存储类。本质上是基于XML文件进行存储Key-Value键值对的数据,生成的XML文件的目录在/data/data/包名/Shared_Pref/下。主要是用来存储一些简单的配置信息,如登录时是否保存用户名密码等。

SharedPreferences本身只能获取数据而不支持存储或修改,存储修改是通过SharedPreferences的一个内部接口Editor来实现的。

实现SharedPreferences存储的步骤如下:

① 获取SharedPreferences对象;

② 获取SharedPreferences.Editor对象;

③ 通过Editor接口的putXxx方法保存K-V键值对。Xxx表示不同的数据类型(float,int,String,boolean,long);

④ 使用Editor接口的commit方法进行操作的提交。

使用SharedPreferences的过程比较简单,下面通过一个保存用户名的小案例演示一下SharedPreferences的简单使用。

主布局文件:

Android数据存储之SharedPreferences使用Android数据存储之SharedPreferences使用
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools
="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height
="match_parent"
android:orientation
="vertical"
tools:context
=".MainActivity">
<LinearLayout
android:orientation="horizontal"
android:layout_marginTop
="20dp"
android:layout_width
="match_parent"
android:layout_height
="wrap_content">
<TextView
android:id="@+id/tvUsername"
android:layout_width
="wrap_content"
android:layout_height
="match_parent"
android:layout_marginLeft
="10dp"
android:layout_marginRight
="10dp"
android:layout_marginTop
="14dp"
android:text
="用户名"
android:textSize
="20dp"
android:textAlignment
="center"/>
<EditText
android:id="@+id/etUsername"
android:layout_width
="match_parent"
android:layout_height
="wrap_content"
android:theme
="@style/Base.V7.Widget.AppCompat.EditText"/>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width
="match_parent"
android:layout_height
="wrap_content"
android:layout_marginTop
="20dp">
<TextView
android:id="@+id/tvPassword"
android:layout_width
="wrap_content"
android:layout_height
="match_parent"
android:layout_marginLeft
="10dp"
android:layout_marginRight
="10dp"
android:layout_marginTop
="14dp"
android:text
="密 码"
android:textSize
="20dp"
android:textAlignment
="center"/>
<EditText
android:id="@+id/etPassword"
android:layout_width
="match_parent"
android:layout_height
="wrap_content"
android:inputType
="textPassword"
android:theme
="@style/Base.V7.Widget.AppCompat.EditText"/>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width
="match_parent"
android:layout_height
="wrap_content"
android:layout_marginTop
="20dp">
<TextView
android:id="@+id/tvRememberUsername"
android:text
="保存用户名"
android:textSize
="15dp"
android:layout_marginLeft
="10dp"
android:layout_width
="wrap_content"
android:layout_height
="wrap_content" />
<CheckBox
android:id="@+id/cbRememberUsername"
android:layout_width
="wrap_content"
android:layout_height
="wrap_content" />

</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width
="match_parent"
android:layout_height
="wrap_content"
android:layout_marginTop
="20dp">
<Button
android:id="@+id/btnLogin"
android:layout_width
="0dp"
android:layout_weight
="1"
android:layout_marginRight
="15dp"
android:layout_marginLeft
="10dp"
android:layout_height
="60dp"
android:text
="登录"
android:textSize
="20dp"/>

<Button
android:id="@+id/btnCancel"
android:layout_width
="0dp"
android:layout_weight
="1"
android:layout_marginRight
="10dp"
android:layout_marginLeft
="5dp"
android:layout_height
="60dp"
android:text
="取消"
android:textSize
="20dp"/>

</LinearLayout>
</LinearLayout>
activity_main

MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
//声明控件
private EditText etUsername, etPassword;
private TextView tvUsername, tvPassword, tvSaveUsername;
private CheckBox cbSaveUsername;
private Button btLogin, btCancel;
//声明SharedPreferences对象
private SharedPreferences preferences;
//声明Editor对象
private SharedPreferences.Editor editor;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
//初始化控件
/**
* 通过getSharedPreferences方法获取SharedPreferences对象,
* getSharedPreferences(String name,int mode)
* name: 生成的XML文件的名字
* mode: 生成的XML文件的权限(是否能被其他程序读取等)
*
* 也可以使用PreferenceManager.getDefaultSharedPreferences(this)获取SharedPreferences对象,
* 这样生成的XML文件名为: 包名+“_preferences”
* XML权限为:MODE_PRIVATE
*/
// preferences = PreferenceManager.getDefaultSharedPreferences(this);
preferences = getSharedPreferences("myPref", MODE_PRIVATE);
//获取Editor对象
editor = preferences.edit();
//通过SharedPreferences对象的getXxx方法获取Key对应的Value,第二个参数为默认值
String name = preferences.getString("username", "");
//如果name为空,说明还未进行过用户名的存储
if (name == null) {
cbSaveUsername.setChecked(
false);
}
else {//如果不为空则将已存储的用户名自动填写到编辑框中
cbSaveUsername.setChecked(true);
etUsername.setText(name);
}

}

//初始化控件
private void initViews() {
etUsername
= (EditText) findViewById(R.id.etUsername);
etPassword
= (EditText) findViewById(R.id.etPassword);
tvUsername
= (TextView) findViewById(R.id.tvUsername);
tvPassword
= (TextView) findViewById(R.id.tvPassword);
tvSaveUsername
= (TextView) findViewById(R.id.tvRememberUsername);
cbSaveUsername
= (CheckBox) findViewById(R.id.cbRememberUsername);
btLogin
= (Button) findViewById(R.id.btnLogin);
btCancel
= (Button) findViewById(R.id.btnCancel);
btLogin.setOnClickListener(
this);
btCancel.setOnClickListener(
this);
}

//按钮点击事件
@Override
public void onClick(View v) {
//获取到编辑框中的用户名和密码
String name = etUsername.getText().toString();
String pass
= etPassword.getText().toString();

switch (v.getId()) {
//登录按钮的点击处理
case R.id.btnLogin:
//如果用户名和密码合法
if ("admin".equals(name) && "abc123".equals(pass)) {
//如果勾选了保存用户名的复选框,则将用户名存储到XML文件中
if (cbSaveUsername.isChecked()) {
editor.putString(
"username", name);
}
else {//如果没有勾选则将用户名从XML文件中移除(如果有的话)
editor.remove("username");
}
//使用Editor对象操作后,需要调用commit方法进行提交,不然所有的操作都无效。类似与数据库中事务的提交
editor.commit();
Toast.makeText(
this, "登录成功", Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(
this, "登录失败", Toast.LENGTH_SHORT).show();
}
break;
case R.id.btnCancel:
break;
}
}
}

完整源码 :  点击下载

 

作者: caobotao
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。