• 展开说说: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工具类
      1. private static SharedPreferences preferences;
      2. public static final String SPNAME = "appSpName";
      3. public static void putString(String key,String value){
      4. getSP().edit().putString(key,value).apply();
      5. Log.e(TAG, "putString: "+ getString(key,"你太着急了"));
      6. }
      7. public static String getString(String key,String defaultValue){
      8. return getSP().getString(key, defaultValue);
      9. }
      10. public static void putInt(String key,int value){
      11. getSP().edit().putInt(key,value).apply();
      12. }
      13. public static int getInt(String key,int defaultValue){
      14. return getSP().getInt(key, defaultValue);
      15. }
      16. public static void putBoolean(String key,boolean value){
      17. getSP().edit().putBoolean(key,value).apply();
      18. }
      19. public static boolean getBoolean(String key,boolean defaultValue){
      20. return getSP().getBoolean(key, defaultValue);
      21. }
      22. public static void putFloat(String key,float value){
      23. getSP().edit().putFloat(key,value).apply();
      24. }
      25. public static float getFloat(String key,float defaultValue){
      26. return getSP().getFloat(key, defaultValue);
      27. }
      28. public static void putLong(String key,long value){
      29. getSP().edit().putLong(key,value).apply();
      30. }
      31. public static long getLong(String key,long defaultValue){
      32. return getSP().getLong(key, defaultValue);
      33. }
      34. /**
      35. * 根据key值删除指定元素,各类型通用因为大家的key都是String
      36. * @param key
      37. */
      38. public static void deleteValue(String key){
      39. getSP().edit().remove(key).apply();
      40. }
      41. /**
      42. * 清空了,创建这个sharedpreference所有的
      43. */
      44. public static void clearAll(){
      45. getSP().edit().clear().apply();
      46. }
      47. /**
      48. * 清空了,创建这个sharedpreference所有的
      49. */
      50. public static boolean containsKey(String key){
      51. getSP().edit().clear().apply();
      52. //检查当前键是否存在
      53. boolean isContains=getSP().contains(key);
      54. Log.e(TAG, "containsKey: isContains= "+isContains );
      55. //使用getAll可以返回所有可用的键值
      56. Map<String,?> keyMap=getSP().getAll();
      57. if (!keyMap.isEmpty()){
      58. Set<String> keySet = keyMap.keySet();
      59. for (String myKey: keySet){
      60. Log.e(TAG, "containsKey: myKey= "+myKey );
      61. }
      62. }
      63. return isContains;
      64. }
      65. public static SharedPreferences getSP(){
      66. if (preferences == null){
      67. preferences = BaseApplication.getContext().getSharedPreferences(SPNAME, Context.MODE_PRIVATE);
      68. }
      69. return preferences;
      70. }

      注意:

      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 applycommit前者是异步后者是同步方法。apply方法时在Android API level 9中引入的,调用它会安全的异步写入SharedPreference Editor当下首选方法。

    2. 定义按钮的点击事件并调用这个工具类
      1. @Override
      2. public void onClick(View v) {
      3. int clickId = v.getId();
      4. if (clickId == R.id.asyncAct_putString){
      5. SpUtil.putString("name","张三");
      6. }else if (clickId == R.id.asyncAct_getString){
      7. String name = SpUtil.getString("name", "无名");
      8. String name1 = SpUtil.getString("name1", "无名");
      9. Log.e(TAG, "getString: name= "+ name +" name1= "+name1);
      10. }else if (clickId == R.id.asyncAct_putBoolean){
      11. SpUtil.putBoolean("isBoy",true);
      12. }else if (clickId == R.id.asyncAct_getBoolean){
      13. boolean isBoy = SpUtil.getBoolean("isBoy", false);
      14. Log.e(TAG, "getBoolean: isBoy= "+isBoy);
      15. }else if (clickId == R.id.asyncAct_putInt){
      16. SpUtil.putInt("age",18);
      17. }else if (clickId == R.id.asyncAct_getInt){
      18. int age = SpUtil.getInt("age", -1);
      19. Log.e(TAG, "getInt: age= "+age);
      20. }else if (clickId == R.id.asyncAct_putFloat){
      21. SpUtil.putFloat("height",177.7F);
      22. }else if (clickId == R.id.asyncAct_getFloat){
      23. float height = SpUtil.getFloat("height", 0.00F);
      24. Log.e(TAG, "getFloat: height= "+height );
      25. }else if (clickId == R.id.asyncAct_putLong){
      26. SpUtil.putLong("weight",70L);
      27. }else if (clickId == R.id.asyncAct_getLong){
      28. long weight = SpUtil.getLong("weight", 0L);
      29. Log.e(TAG, "getLong: weight= "+weight );
      30. }else if (clickId == R.id.asyncAct_clearAll){
      31. SpUtil.clearAll();
      32. } else if (clickId == R.id.asyncAct_containsKey){
      33. SpUtil.containsKey("weight");
      34. }
      35. }

    3. 一些小提醒
      1. 应用程序一旦卸载或者通过手机设置页面清缓存,SharedPreference也会被删除。
      2. 在实际开发者很多会涉及敏感数据,针对敏感数据我们呢需要对其加密后再进行存储,取数据也是先解密再使用。
  • 相关阅读:
    BUUCTF web(九)
    【Java】java: 无效的标记: -parameters
    二.go语言条件与循环
    Django实战项目-学习任务系统-自定义URL拦截器
    【深入解读Redis系列】Redis系列(五):切片集群详解
    基于SSH的高校实验室物品管理信息系统的设计与实现 论文文档+项目源码及数据库文件
    【排坑】websoucket场景下文件无法上传到服务器的解决方案
    Java二叉树的镜像
    【AI绘画】Stable Diffusion WebUI
    Go 定时任务实现
  • 原文地址:https://blog.csdn.net/Hidanchaofan/article/details/136772944