在Android中一共提供了5种数据存储方式,分别为:
(1)Files:通过FileInputStream和FileOutputStream对文件进行操作。具体使用方法可以参阅博文《Android学习笔记34:使用文件存储数据》。
(2)Shared Preferences:常用来存储键值对形式的数据,对系统配置信息进行保存。
(3)Content Providers:数据共享,用于应用程序之间数据的访问。
(4)SQLite:Android自带的轻量级关系型数据库,支持SQL语言,用来存储大量的数据,并且能够对数据进行使用、更新、维护等操作。
(5)Network:通过网络来存储和获取数据。
本篇博文主要介绍第二种方式,通过Shared Preferences存储数据。
1.使用Shared Preferences存储数据和读取数据
Shared Preferences是Android系统提供的一个轻量级的存储类,主要用于保存一些配置信息,比如窗口状态(大小、亮度等)。
Shared Preferences使用键值对的形式来存储数据,可以对常用数据类型boolean、float、int、long以及String进行保存。保存的数据以xml文件的形式存储在/data/data/<包名>/shared_prefs目录下。
1.1使用Shared Preferences存储数据
使用Shared Preferences存储数据可以通过以下4个步骤来实现:(1)使用Context类提供的getSharedPreferences()方法,获取SharedPreferences对象。getSharedPreferences()方法的原型如下:
public abstract SharedPreferences getSharedPreferences(String name, int mode);
其中,参数name表示存储数据的文件名。有一点需要注意的是,此处只是定义了该文件名,该文件实际上并没有被创建,该文件只有当创建了SharedPreferences.Edit对象并使用该对象的commit()方法提交数据时,才会被创建。
参数mode用于指定文件的操作模式,其可选值有Context.MODE_APPEND(内容追加模式)、Context.MODE_PRIVATE(默认操作模式)、Context.MODE_WORLD_READABLE(可读模式)、Context.MODE_WORLD_WRITEABLE(可写模式)四种,与《Android学习笔记34:使用文件存储数据》中提到的openFileOutput()方法的第二个参数是一样的。
(2)使用SharedPreferences对象的edit()方法创建SharedPreferences.Edit对象。使用Shared Preferences方式存储数据时需要借助SharedPreferences.Edit类提供的方法来添加数据。SharedPreferences.Edit类提供的方法如图1所示。
图1 SharedPreferences.Edit类提供的方法
可以看出,SharedPreferences.Edit类提供了以键值对的形式存储boolean、float、int、long以及String数据类型的数据的方法。
(3)使用SharedPreferences.Edit对象存储数据。
(4)使用commit()方法提交数据。
通过以上的4个步骤实现数据存储的一个简单示例如下:
1 /* 2 * Function : 保存数据到SharedPreferences对象中 3 * Param : fileName保存数据的文件名;userName、userPswd保存的数据 4 * Author : 博客园-依旧淡然 5 */ 6 public boolean saveDataToSharedPreferences(String fileName, String userName, int userPswd) { 7 boolean isSaveDataSuccess = false; //存储数据成功标志位 8 SharedPreferences sharedPreferences = mContext.getSharedPreferences(fileName, Context.MODE_PRIVATE); 9 SharedPreferences.Editor edit = sharedPreferences.edit(); //创建SharedPreferences.Editor对象 10 edit.putString("userName", userName); //存储数据 11 edit.putInt("userPswd", userPswd); 12 isSaveDataSuccess = edit.commit(); //提交存储数据 13 return isSaveDataSuccess; 14 }
通过以上的代码,我们创建了一个Context.MODE_PRIVATE(默认操作模式)的数据存储文件,该文件中可以保存两项内容:userName和userPswd。
1.2单体测试
为了验证以上这段代码的正确性,我们可以编写一段单体测试代码对其进行快速验证。具体的单体测试代码如下:
1 /* 2 * Function : 单体测试,保存数据到SharedPreferences对象中 3 * Author : 博客园-依旧淡然 4 */ 5 public void saveData() { 6 Context context = getContext(); 7 MySharedPreferences mySharedPreferences = new MySharedPreferences(context); 8 String fileName = "userInfo"; //文件名称 9 String userName = "jack"; //保存的数据 10 int userPswd = 123; //保存的数据 11 boolean flag = mySharedPreferences.saveDataToSharedPreferences(fileName, userName, userPswd); 12 Log.i(TAG, "-->>" + flag); 13 }
运行该单体测试,我们可以看到Log日志中,flag打印结果为true,表明数据存储成功。并且我们创建了一个名为“userInfo”的存储文件,并在其中保存了两条数据内容:userName = "jack"和userPswd = 123。
那么,“userInfo”文件究竟被存放到了什么地方呢?答案是/data/data/<包名>/shared_prefs目录下,如图2所示。
图2 Shared Preferences方式存储数据的文件目录
有一点需要注意,以Shared Preferences方式存储数据时,文件会默认的以xml的格式进行存储。
打开“userInfo.xml”文件,可以看到其中内容如图3所示。
图3 “userInfo.xml”文件内容
可见,通过以上的代码确实可以实现数据的正确存储。
1.3使用Shared Preferences读取数据
那么,又该如何在程序中读取存储在“userInfo.xml”文件中的内容呢?下面的代码给出了一种实现的方案。
1 /* 2 * Function : 从SharedPreferences对象中读取数据 3 * Param : fileName保存数据的文件名 4 * Author : 博客园-依旧淡然 5 */ 6 public Map<String, Object> readDataFromSharedPreferences(String fileName) { 7 Map<String, Object> map = new HashMap<String, Object>(); //Map对象,用于存储读取到的数据 8 SharedPreferences sharedPreferences = mContext.getSharedPreferences(fileName, Context.MODE_PRIVATE); 9 String userName = sharedPreferences.getString("userName", ""); //读取SharedPreferences对象中的数据 10 int userPswd = sharedPreferences.getInt("userPswd", 0); 11 map.put("userName", userName); //将读取到的数据存入Map对象 12 map.put("userPswd", userPswd); 13 return map; 14 }
通过以上的代码,实现了从Shared Preferences对象中读取数据,并将读取到的数据保存到了Map对象中。