展开说说: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. 在实际开发者很多会涉及敏感数据,针对敏感数据我们呢需要对其加密后再进行存储,取数据也是先解密再使用。
相关推荐
杉氧1 小时前
副作用 (Side Effects) 全攻略:如何像大师一样掌控 Composable 的生命周期?
android·架构·android jetpack
Kapaseker5 小时前
Kotlin Toolchain 0.11 发布:主要是把 Amper 干没了
android·kotlin
三少爷的鞋6 小时前
Android 现代架构不需要事件总线进阶篇
android
杉氧21 小时前
深入理解 Compose 重组机制:快照系统如何驱动 UI 精准刷新?
android·架构·android jetpack
召钱熏21 小时前
状态枚举正确≠渲染正确:一个语音按钮的状态机边界修复实录
android·前端
杉氧1 天前
深度解析:Jetpack Compose 核心架构与底层原理 —— 十年安卓老兵的“破茧重生”
android·架构·android jetpack
通玄1 天前
Jetpack Compose 入门系列(七):ViewModel 与界面状态管理
android
落魄Android在线炒饭1 天前
Android Framework 开发技巧:android.jar 生成与系统快速编译验证
android
如此风景1 天前
Kotlin Flow操作符学习
android·kotlin
plainGeekDev1 天前
GreenDAO → Room
android·java·kotlin