当前位置:   article > 正文

安卓SharedPreference的详解及总结_android sharedpreference

android sharedpreference

        这段时间在做一个新的项目,大家都知道项目中必不可少的是数据的存储,今天想讲解的是轻量级的SharedPreference的存储,之所以想写这篇文章是因为在项目的开发过程中在进入app做的数据存储,退出app存储的数据就没了,我就瞬间懵逼,以为自己写的SharedPreference工具类有问题,就一直在断点,断点发现没问题又去看SharedPreference的源码,到最后还是没找到问题的所在。最后去看退出app的相关操作,才发现另外一个同事在退出的时候把SharedPreference里面的数据全清空了,瞬间内心是崩溃的大哭。。。。。。。不过也好,至少自己更加清楚了SharedPreference。

      首先简单介绍一下SharedPreference:

         它的特点是:1. 只支持java的基本数据类型,不支持自定义数据类型;
                                 2. app内部数据共享,因为文件存储在手机中,所以存储时间久;
                                 3. 使用xml的方式存储,只需要关注key value,使用非常的方便简单 ;


     那么接下来看是怎么用的:

        存储数据:

  1. SharedPreferences sp = getSharedPreferences("SP_TEST", Context.MODE_PRIVATE);
  2. Editor editor = sp.edit();
  3. editor.putString("name", "小明");
  4. editor.putInt("age", 11);
  5. editor.commit();

 

       在这里需要提醒不要写成:

  1. sp.edit().putString("name", "小明");
  2. sp.edit().putInt("age", 11);
  3. sp.edit().commit();

       写成这样的话是无法存储数据的,以为sp.edit()返回的是editor的对象,如果写成这样会导致不是同一个对象在操作,Editor的实现类EditorImpl里面会有一个缓存的Map,最后commit的时候先将缓存里面的Map写入内存中的Map,然后将内存中的Map写进XML文件中。使用上面的方式commit,由于sp.edit()又重新返回了一个新的Editor对象,缓存中的Map是空的,所以导致数据无法被存储,大家只需要稍微注意下就好。 

     获取数据:

  1. SharedPreferences sp = getSharedPreferences("SP_TEST", Context.MODE_PRIVATE);
  2. String name = sp.getString("name", null);
  3. int age = sp.getInt("age", 0);


    如果你没有存储这个值,那么String类型的默认返回null,int类型的默认返回的是o;
   通过以上的讲解相信大家都会用了,但是你如果是as开发的话就会发现官方推荐的是apply()方法而不是commit()方法,这样大家就有疑惑了,两个方法有啥区别呢?那我们先看下官方怎么说:


  1. Commit your preferences changes back from this Editor to the SharedPreferences object it is editing. This atomically performs the requested modifications,
  2. replacing whatever is currently in the SharedPreferences.
  3. Note that when two editors are modifying preferences at the same time, the last one to call apply wins.
  4. Unlike commit(), which writes its preferences out to persistent storage synchronously, apply() commits its changes to the in-memory SharedPreferences
  5. immediately but starts an asynchronous commit to disk and you won't be notified of any failures. If another editor on this SharedPreferences does a
  6. regular commit() while a apply() is still outstanding, the commit() will block until all async commits are completed as well as the commit itself.
  7. As SharedPreferences instances are singletons within a process, it's safe to replace any instance of commit() with apply() if you were already ignoring
  8. the return value.
  9. You don't need to worry about Android component lifecycles and their interaction with apply() writing to disk. The framework makes sure in-flight disk
  10. writes from apply() complete before switching states.
  11. The SharedPreferences.Editor interface isn't expected to be implemented directly. However, if you previously did implement it and are now getting errors
  12. about missing apply(), you can simply call commit() from apply().



这段英文的意思很简单,大致总结下来就是:

1、apply没有返回值,commit会返回一个Boolean值,表明是否修改成功。

2、apply方法是将share的修改提交到内存而后异步写入磁盘,但是commit是直接写入磁盘,这就造成两者性能上的差异,犹如apply不直接写入磁盘而share本身是单例创建,apply方法会覆写之前内存中的值,异步写入磁盘的值只是最后的值,而commit每次都要写入磁盘,而磁盘的写入相对来说是很低效的,所以apply方法在频繁调用时要比commit效率高很多。

3、apply方法不会提示任何失败的提示。


由于在一个进程中,sharedPreference是单实例,一般不会出现并发冲突,如果对提交的结果不关心的话,建议使用apply,当然需要确保提交成功且有后续操作的话,还是需要commit的。

好了今天的博客就到这,下面把自己写的 sharedPreference的工具类贴出来:

  1. public class SPUtils {
  2. private SharedPreferences sp;
  3. private SharedPreferences.Editor editor;
  4. /**
  5. * SPUtils构造函数
  6. * <p>在Application中初始化</p>
  7. *
  8. * @param context 上下文
  9. * @param spName spName
  10. */
  11. public SPUtils(Context context, String spName) {
  12. sp = context.getSharedPreferences(spName, Context.MODE_PRIVATE);
  13. editor = sp.edit();
  14. editor.apply();
  15. }
  16. /**
  17. * 获取用户信息的SharedPreferences
  18. * @param context 上下文
  19. * ConstUtils.SP_NAME "appInfo"
  20. * @return
  21. */
  22. public static SPUtils getUserSp(Context context){
  23. SPUtils spUtils = new SPUtils(context, ConstUtils.SP_NAME);
  24. return spUtils;
  25. }
  26. /**
  27. * SP中写入String类型value
  28. *
  29. * @param key 键
  30. * @param value 值
  31. */
  32. public void putString(String key, String value) {
  33. editor.putString(key, value).apply();
  34. }
  35. /**
  36. * SP中读取String
  37. *
  38. * @param key 键
  39. * @return 存在返回对应值,不存在返回默认值{@code null}
  40. */
  41. public String getString(String key) {
  42. return getString(key, null);
  43. }
  44. /**
  45. * SP中读取String
  46. *
  47. * @param key 键
  48. * @param defaultValue 默认值
  49. * @return 存在返回对应值,不存在返回默认值{@code defaultValue}
  50. */
  51. public String getString(String key, String defaultValue) {
  52. return sp.getString(key, defaultValue);
  53. }
  54. /**
  55. * SP中写入int类型value
  56. *
  57. * @param key 键
  58. * @param value 值
  59. */
  60. public void putInt(String key, int value) {
  61. editor.putInt(key, value).apply();
  62. }
  63. /**
  64. * SP中读取int
  65. *
  66. * @param key 键
  67. * @return 存在返回对应值,不存在返回默认值-1
  68. */
  69. public int getInt(String key) {
  70. return getInt(key, -1);
  71. }
  72. /**
  73. * SP中读取int
  74. *
  75. * @param key 键
  76. * @param defaultValue 默认值
  77. * @return 存在返回对应值,不存在返回默认值{@code defaultValue}
  78. */
  79. public int getInt(String key, int defaultValue) {
  80. return sp.getInt(key, defaultValue);
  81. }
  82. /**
  83. * SP中写入long类型value
  84. *
  85. * @param key 键
  86. * @param value 值
  87. */
  88. public void putLong(String key, long value) {
  89. editor.putLong(key, value).apply();
  90. }
  91. /**
  92. * SP中读取long
  93. *
  94. * @param key 键
  95. * @return 存在返回对应值,不存在返回默认值-1
  96. */
  97. public long getLong(String key) {
  98. return getLong(key, -1L);
  99. }
  100. /**
  101. * SP中读取long
  102. *
  103. * @param key 键
  104. * @param defaultValue 默认值
  105. * @return 存在返回对应值,不存在返回默认值{@code defaultValue}
  106. */
  107. public long getLong(String key, long defaultValue) {
  108. return sp.getLong(key, defaultValue);
  109. }
  110. /**
  111. * SP中写入float类型value
  112. *
  113. * @param key 键
  114. * @param value 值
  115. */
  116. public void putFloat(String key, float value) {
  117. editor.putFloat(key, value).apply();
  118. }
  119. /**
  120. * SP中读取float
  121. *
  122. * @param key 键
  123. * @return 存在返回对应值,不存在返回默认值-1
  124. */
  125. public float getFloat(String key) {
  126. return getFloat(key, -1f);
  127. }
  128. /**
  129. * SP中读取float
  130. *
  131. * @param key 键
  132. * @param defaultValue 默认值
  133. * @return 存在返回对应值,不存在返回默认值{@code defaultValue}
  134. */
  135. public float getFloat(String key, float defaultValue) {
  136. return sp.getFloat(key, defaultValue);
  137. }
  138. /**
  139. * SP中写入boolean类型value
  140. *
  141. * @param key 键
  142. * @param value 值
  143. */
  144. public void putBoolean(String key, boolean value) {
  145. editor.putBoolean(key, value).apply();
  146. }
  147. /**
  148. * SP中读取boolean
  149. *
  150. * @param key 键
  151. * @return 存在返回对应值,不存在返回默认值{@code false}
  152. */
  153. public boolean getBoolean(String key) {
  154. return getBoolean(key, false);
  155. }
  156. /**
  157. * SP中读取boolean
  158. *
  159. * @param key 键
  160. * @param defaultValue 默认值
  161. * @return 存在返回对应值,不存在返回默认值{@code defaultValue}
  162. */
  163. public boolean getBoolean(String key, boolean defaultValue) {
  164. return sp.getBoolean(key, defaultValue);
  165. }
  166. /**
  167. * SP中获取所有键值对
  168. *
  169. * @return Map对象
  170. */
  171. public Map<String, ?> getAll() {
  172. return sp.getAll();
  173. }
  174. /**
  175. * SP中移除该key
  176. *
  177. * @param key 键
  178. */
  179. public void remove(String key) {
  180. editor.remove(key).apply();
  181. }
  182. /**
  183. * SP中是否存在该key
  184. *
  185. * @param key 键
  186. * @return {@code true}: 存在<br>{@code false}: 不存在
  187. */
  188. public boolean contains(String key) {
  189. return sp.contains(key);
  190. }
  191. /**
  192. * SP中清除所有数据
  193. */
  194. public void clear() {
  195. editor.clear().apply();
  196. }
  197. }

仅自勉,不喜勿喷。



声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/数据灵魂/article/detail/60755
推荐阅读
相关标签
  

闽ICP备14008679号