展开说说: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. 在实际开发者很多会涉及敏感数据,针对敏感数据我们呢需要对其加密后再进行存储,取数据也是先解密再使用。
相关推荐
幻雨様5 小时前
UE5多人MOBA+GAS 45、制作冲刺技能
android·ue5
Jerry说前后端6 小时前
Android 数据可视化开发:从技术选型到性能优化
android·信息可视化·性能优化
Meteors.7 小时前
Android约束布局(ConstraintLayout)常用属性
android
alexhilton8 小时前
玩转Shader之学会如何变形画布
android·kotlin·android jetpack
whysqwhw12 小时前
安卓图片性能优化技巧
android
风往哪边走12 小时前
自定义底部筛选弹框
android
Yyyy48213 小时前
MyCAT基础概念
android
Android轮子哥13 小时前
尝试解决 Android 适配最后一公里
android
雨白14 小时前
OkHttp 源码解析:enqueue 非同步流程与 Dispatcher 调度
android
风往哪边走15 小时前
自定义仿日历组件弹框
android