展开说说:Android之SharedPreferences

SharedPreferences 是一种轻量级的数据持久化存储机制。以key/value键值对形式存储在xml文件,用于保存一些应用程序数据。保存 /data/data/PACKAGE_NAME/shared_prefs /xxx.Xml文件

SharedPreferences 只能存储 string,int,float,long和boolean五个基本数据类型。如果需要存取比较复杂的数据类型,则需要对这些数据进行序列化。这一点通过源码可以看到SharedPreferences是个接口它的内部接口是Editor,里面定义了上面五个数据类型的put方法,以及putString、remove、clear、commit、apply方法。

上面可以看出getxx方法不在Edit接口中,他们是在SharedPreferences

父级接口定义的,因此增加、删除、清空方法需要使用edit但get方法不用,下面距离分别验证这些方法。另外下面还有个是检查当前键是否存在 可以返回所有可用的键值 两个方法。

  1. 布局定义了一些按钮
  1. 定义 getSharedPreferences 工具类
   private static SharedPreferences preferences;
   public static final String SPNAME = "appSpName";

   public static void putString(String key,String value){
       getSP().edit().putString(key,value).apply();
       Log.e(TAG, "putString: "+ getString(key,"你太着急了"));
   }
   public static String getString(String key,String defaultValue){
       return getSP().getString(key, defaultValue);
   }


   public static void putInt(String key,int value){
       getSP().edit().putInt(key,value).apply();
   }
   public static int getInt(String key,int defaultValue){
       return getSP().getInt(key, defaultValue);
   }


   public static void putBoolean(String key,boolean value){
       getSP().edit().putBoolean(key,value).apply();
   }
   public static boolean getBoolean(String key,boolean defaultValue){
       return getSP().getBoolean(key, defaultValue);
   }


   public static void putFloat(String key,float value){
       getSP().edit().putFloat(key,value).apply();
   }
   public static float getFloat(String key,float defaultValue){
       return getSP().getFloat(key, defaultValue);
   }


   public static void putLong(String key,long value){
       getSP().edit().putLong(key,value).apply();
   }
   public static long getLong(String key,long defaultValue){
       return getSP().getLong(key, defaultValue);
   }

   /**
    * 根据key值删除指定元素,各类型通用因为大家的key都是String
    * @param key
    */
   public static void deleteValue(String key){
       getSP().edit().remove(key).apply();
   }

   /**
    * 清空了,创建这个sharedpreference所有的
    */
   public static void clearAll(){
       getSP().edit().clear().apply();
   }

   /**
    * 清空了,创建这个sharedpreference所有的
    */
   public static boolean containsKey(String key){
       getSP().edit().clear().apply();
       //检查当前键是否存在
       boolean isContains=getSP().contains(key);
       Log.e(TAG, "containsKey: isContains= "+isContains );
       //使用getAll可以返回所有可用的键值
       Map<String,?> keyMap=getSP().getAll();
       if (!keyMap.isEmpty()){
           Set<String> keySet = keyMap.keySet();
           for (String myKey: keySet){
               Log.e(TAG, "containsKey: myKey= "+myKey );
           }
       }

       return isContains;
   }

   public static SharedPreferences getSP(){
       if (preferences == null){
           preferences = BaseApplication.getContext().getSharedPreferences(SPNAME, Context.MODE_PRIVATE);
       }
       return preferences;
   }

注意:

2.1 BaseApplication.getContext ().getSharedPreferences(SPNAME , Context.MODE_PRIVATE );

getSharedPreferences 方法传入的操作模式
Context.MODE_PRIVATE :为默认操作模式 , 代表该文件是私有数据 , 只能被应用本身访问 , 在该模式下 , 写入的内容会覆盖原文件的内容
Context.MODE_APPEND :模式会检查文件是否存在 , 存在就往文件追加内容 , 否则就创建新文件 .
特别注意: 还有两个 MODE_WORLD_READABLE MODE_WORLD_WRITEABLE 我们不需要学习了,他们 用来控制其他应用是否有权限读写该文件 , Android 4.2 版本中已经被弃用

2.2 apply commit 前者是异步后者是同步方法。 apply 方法时在 Android API level 9 中引入的,调用它会安全的异步写入 SharedPreference Editor 当下 首选方法。

  1. 定义按钮的点击事件并调用这个工具类
   @Override
   public void onClick(View v) {
       int clickId = v.getId();
       if (clickId == R.id.asyncAct_putString){
           SpUtil.putString("name","张三");
       }else if (clickId == R.id.asyncAct_getString){
           String name = SpUtil.getString("name", "无名");
           String name1 = SpUtil.getString("name1", "无名");
           Log.e(TAG, "getString: name= "+ name +"    name1= "+name1);
       }else if (clickId == R.id.asyncAct_putBoolean){
           SpUtil.putBoolean("isBoy",true);
       }else if (clickId == R.id.asyncAct_getBoolean){
           boolean isBoy = SpUtil.getBoolean("isBoy", false);
           Log.e(TAG, "getBoolean: isBoy= "+isBoy);
       }else if (clickId == R.id.asyncAct_putInt){
           SpUtil.putInt("age",18);
       }else if (clickId == R.id.asyncAct_getInt){
           int age = SpUtil.getInt("age", -1);
           Log.e(TAG, "getInt:   age= "+age);
       }else if (clickId == R.id.asyncAct_putFloat){
           SpUtil.putFloat("height",177.7F);
       }else if (clickId == R.id.asyncAct_getFloat){
           float height = SpUtil.getFloat("height", 0.00F);
           Log.e(TAG, "getFloat: height= "+height );
       }else if (clickId == R.id.asyncAct_putLong){
           SpUtil.putLong("weight",70L);
       }else if (clickId == R.id.asyncAct_getLong){
           long weight = SpUtil.getLong("weight", 0L);
           Log.e(TAG, "getLong: weight= "+weight );
       }else if (clickId == R.id.asyncAct_clearAll){
           SpUtil.clearAll();
       } else if (clickId == R.id.asyncAct_containsKey){
           SpUtil.containsKey("weight");
       }
   }
  1. 一些小提醒
    1. 应用程序一旦卸载或者通过手机设置页面清缓存,SharedPreference也会被删除。
    2. 在实际开发者很多会涉及敏感数据,针对敏感数据我们呢需要对其加密后再进行存储,取数据也是先解密再使用。
相关推荐
dgiij31 分钟前
AutoX.js向后端传输二进制数据
android·javascript·websocket·node.js·自动化
SevenUUp1 小时前
Android Manifest权限清单
android
高林雨露1 小时前
Android 检测图片抓拍, 聚焦图片后自动完成拍照,未对准图片的提示请将摄像头对准要拍照的图片
android·拍照抓拍
wilanzai2 小时前
Android View 的绘制流程
android
INSBUG3 小时前
CVE-2024-21096:MySQLDump提权漏洞分析
android·adb
Mercury Random4 小时前
Qwen 个人笔记
android·笔记
苏苏码不动了4 小时前
Android 如何使用jdk命令给应用/APK重新签名。
android
aqi005 小时前
FFmpeg开发笔记(五十三)移动端的国产直播录制工具EasyPusher
android·ffmpeg·音视频·直播·流媒体
xiaoduyyy6 小时前
【Android】ToolBar,滑动菜单,悬浮按钮和可交互提示等的使用方法
android
liyy6146 小时前
Android架构组件:MVVM模式的实战应用与数据绑定技巧
android