【数据持久化】SharePreference 指南

简介

SharePreference 用于保存相对较小的键值对数据
常用于 保存登录信息,引导页状态,设置信息(是否开启通知)状态等。需要注意信息的安全性,不要存储敏感信息,比如用户的账号密码。

  • 基础使用
    • 1.1 声明 sharedPreference 对象
    • 1.2 存入数据
    • 1.3 取出数据
    • 1.4 删除数据
  • 如何查看 SharePreference 保存的文件呢?
  • 注意事项
  • 总结
  • 常见面试题
  • 资料

基础使用

1.1 声明 sharedPreference 对象

//在 Context 中使用 , 需要传入文件名
val sp = activity?.getSharedPreferences(
        "spFileName", Context.MODE_PRIVATE)
//在 Activity 中使用,会默认生成一个和当前 Activity 相关的文件名
val sp = activity?.getPreferences(Context.MODE_PRIVATE)

一般使用 Context 的方式来获取 sharedPreference 对象**

第二个参数是什么意思呢?

@IntDef(flag = true, prefix = {
    
     "MODE_" }, value = {
    
    
        MODE_PRIVATE,//私有文件         
        MODE_WORLD_READABLE,//可读文件
        MODE_WORLD_WRITEABLE,//可读文件
        MODE_MULTI_PROCESS,//多进程模式
})
@Retention(RetentionPolicy.SOURCE)
public @interface PreferencesMode {
    
    }

目前只有 MODE_PRIVATE 是可用的,其他都弃用了。

**MODE_WORLD_READABLE MODE_WORLD_WRITEABLE ** 被 FileProvider 代替

**MODE_MULTI_PROCESS ** 在某些Android版本中不可靠地工作,并且没有提供任何机制来协调跨进程的并发修改。应用程序不应尝试使用它。相反,他们应该使用显式的跨进程数据管理方法,例如 ContentProvider.

1.2 存储数据

2种提交方式

  //同步提交,会同步写入磁盘,在需要等待结果的场景可以使用 
  //避免在主线程调用,它可能会导致页面卡顿
  sp.edit().putString(key, value).commit()
  //异步提交,会先更新到内存,然后异步存储到磁盘
  sp.edit().putString(key, value).apply()

存储数据的类型
String Int Boolean Float Long StringSet

1.3 取出数据

//没有存储值的情况下,会返回 defValue
sp.getString(key,defValue)

1.4 删除数据

//清空所有数据
sp.edit().clear()
//移除指定Key的数据
sp.edit().remove(String s)

如何查看 SharePreference 保存的文件呢?

使用 Android Studio 的 Device File Explorer

/data/data/APP包名/shared_prefs/文件名.xml

注意事项

  • 不支持多进程
  • 不要用明文存储敏感信息,安全性低
  • 不要存放大的 key 和 value ,会增加卡顿的风险
  • 不同业务的 key 可以存放在不同文件下,减少文件大小。

    文件越大,卡顿发生的几率越高

  • 合并提交内容,可以同时提交多个改动,共用一次 apply()

    sp 是全量更新的,合并提交可以减少修改的次数

  • 尽量不要存放复杂的 json 文件

    有遇到过缓存整个 list 的 json 存在 sp 文件

总结

SharePreference 适合保存相对较小的键值对数据,不支持多进程。严重时会导致 ANR,注意不要存储大数据。如果需要支持多进程,请使用 DataStore , 目前 DataStore 基本可以完全取代 SharePreference 。所以这篇文章也是记录 SharePreference 从入门到放弃!

常见面试题

1. commit() 和 apply() 的区别?
2. sharePreference 如何支持多进程?
3. sharePreference 为什么会导致 ANR?
4. 如何解决 sharePreference 的 ANR 问题?

资料

猜你喜欢

转载自blog.csdn.net/Android_yh/article/details/130093994