Android学习笔记35:使用Shared Preferences方式存储数据

  在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对象中。

posted @ 2013-04-07 23:38  依旧淡然  阅读(11630)  评论(0编辑  收藏  举报