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

  • 相关阅读:
    判断图片是否存在,不存在则显示默认图片
    移动端开发时代理手机http访问查看效果(iphone)
    VS Code搭建TypeScript开发环境
    map,foreach和for的使用
    记一些常用的git命令
    js中创建对象的5种方法
    vuex简单使用
    记一下Slot的使用
    ES6中的箭头函数和普通函数有什么区别?
    计算属性、方法、侦听属性的区别
  • 原文地址:https://www.cnblogs.com/britalient/p/3173249.html
Copyright © 2020-2023  润新知