Android学习:利用SharedPreferences存储数据
SharedPreferences是Android系统提供的一种轻量级的数据存储方式,主要用来存储一些简单的数据,如系统登录的用户名和密码等,或者存储常用的系统配置信息,如窗口状态等。
SharedPreferences可以保存和检索的各种基本数据类型(boolean、float、int、long、string)的持久键值对,是基于XML文件存储的key-value键值对数据,该XML文件存储在手机的data/data/<package name>/shared_prefs目录下。
利用SharedPreferences进行数据存取的基本用法如下:
(1)获取SharedPreferences对象
可以通过两种方式获取SharedPreferences对象。
方法一:调用Context对象的getSharedPreferences()方法,基本代码如下:
getSharedPreferences(String name,int mode);
方法二:调用Activity对象的getPreferences()方法,基本代码如下:
getPreferences(int mode);
根据参数name,可以获取相应的SharedPreferences对象,name表示要操作的XML文件名;参数mode有以下几个可选值。
Context.MODE_PRIVATE : 指定该SharedPreferences数据只能被本应用程序进行读、写操作。
Context.MODE_WORLD_WRITEABLE :指定该SharedPreferences数据能被其他应用读,写。
Context.MODE_WORLD_READABLE :指定该SharedPreferences数据能被其他应用程序读,但是不能写。
Context.MODE_MULTI_PROCESS : 这是SDK 2.3之后添加的选项,当多个进程读写同一个SharedPreferences时,它会检查文件是否被修改。
以上两种方法的区别:
第一种方法(getSharedPreferences())获取的SharedPreferences对象可以被同一应用程序下的其他组件共享;
第二种方法(getPreferences())获取的SharedPreferences对象只能在该Activity中使用
(2)向 SharedPreferences中写入值
首先,通过SharedPreferences.Editor获取Editor对象。
然后,使用对应具体数据类型的Editor的相应方法(如putBoolean()或putString()等)来存入值。
最后,调用Editor的commit()方法提交写入值的操作。
另外,Editor还有两个常用的方法,用来从Preferences中移除键值。
editor.remove(String key): 用于下次通过commit()方法提交操作时移除key对应的键值对。
editor.clear(): 用于移除所有键值对。
(3)从SharedPreferences中读写值
使用对应具体数据类型的Editor的相应方法getXxxx()来读取键值。
示例:开发一个Android应用程序,利用SharedPreferences来存储当前输入的用户名和密码信息,通过单击相应的功能按钮,来实现数据的保存、提取和移除所有键值对等基本功能。
XML布局代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
tools:context="zut.edu.e13_1.MainActivity">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:text="利用SharedPreferences存储数据"
android:textColor="@android:color/black"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="用户名:"
android:textColor="@android:color/black"/>
<EditText
android:id="@+id/editText1"
android:layout_width="120dp"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="密码:"
android:textColor="@android:color/black"/>
<EditText
android:id="@+id/editText2"
android:layout_width="120dp"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="保存数据"/>
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="提取数据"/>
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="移除键值对"/>
</LinearLayout>
</LinearLayout>
MainActivity.java文件:
import android.content.Context;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
//定义各个控件
private EditText username;
private EditText password;
//1.定义要保存SharedPreferences的XML文件
String PREFS_NAME = "ex13_1.mySharedPreferences.unm_pwd";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
username = (EditText) findViewById(R.id.editText1);
password = (EditText) findViewById(R.id.editText2);
final Button button1 = (Button)findViewById(R.id.button1);
final Button button2 = (Button)findViewById(R.id.button2);
final Button button3 = (Button)findViewById(R.id.button3);
//数据保存
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//2.定义一个只允许本程序访问的SharedPreFerences对象
SharedPreferences settings = getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
//3.生成一个保存编辑变量
SharedPreferences.Editor editor = settings.edit();
//4.添加要保存的键值和真值
editor.putString("username",username.getText().toString());
editor.putString("password",password.getText().toString());
//5.提交数据保存
editor.commit();
//清空输入
username.setText("");
password.setText("");
Toast.makeText(MainActivity.this,"数据保存完成",Toast.LENGTH_LONG).show();
}
});
//数据提取
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//提取保存的用户名,如果无则为空
username.setText(getUserName());
//提取保存的密码,如果无则为空
password.setText(getPassWord());
Toast.makeText(MainActivity.this,"数据提取完成",Toast.LENGTH_LONG).show();
}
});
//移除所有键值对
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SharedPreferences settings = getSharedPreferences(PREFS_NAME,Context.MODE_PRIVATE);
//生成一个保存编辑对象
SharedPreferences.Editor editor = settings.edit();
//移除所有键值对
editor.clear();
editor.commit();
username.setText("");
password.setText("");
Toast.makeText(MainActivity.this,"移除所有键值对成功",Toast.LENGTH_LONG).show();;
}
});
}
private String getUserName(){
SharedPreferences settings = getSharedPreferences(PREFS_NAME,Context.MODE_PRIVATE);
//获取一个键值为"username"的值,若Preference中不存在,就用后面的值作为返回值
String username = settings.getString("username","");
return username;
}
private String getPassWord(){
SharedPreferences settings = getSharedPreferences(PREFS_NAME,Context.MODE_PRIVATE);
//获取一个键值为"username"的值,若Preference中不存在,就用后面的值作为返回值
String password = settings.getString("password","");
return password;
}
}
运行即可。