前言

DataStore 是用来取代 SharedPreferences 的一种简易数据存储的解决方案。

既然是方案,也就是说 DataStore 并不是具体的代码实现,目前其具体实现有两种方式:

  • Preferences DataStore
  • Proto DataStore

下面我们来看看如何使用 Preferences DataStore

创建

首先我们得添加下依赖:

implementation "androidx.datastore:datastore-preferences:1.0.0"

然后创建 DataStore:

val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "number")

存储数据

在以往我们使用 SharedPreferences 的时候,我们都是使用 <Key, Value> 的形式进行填写的,但是 DataStore 与 SharedPreferences 不同的是,DataStore 并不是以 String 作为 key,而是以 Preferences.Key 作为 Key,不同的数据类型需要不同写法:

  • Int -> intPreferencesKey(name)
  • Double -> doublePreferencesKey(name)
  • String -> stringPreferencesKey(name)
  • Boolean -> booleanPreferencesKey(name)
  • Float -> floatPreferencesKey(name)
  • Long -> longPreferencesKey(name)
  • Set -> stringSetPreferencesKey(name)

这里我以存储 int 类型作为示例:

     val EXAMPLE_COUNTER = intPreferencesKey("example_counter")   // 创建 keydataStore.edit { settings ->val currentCounterValue = settings[EXAMPLE_COUNTER] ?: 0settings[EXAMPLE_COUNTER] = currentCounterValue + 1}

大概意思其实就是把值读取出来,然后 +1 在放回去。

读取数据

val EXAMPLE_COUNTER = intPreferencesKey("example_counter")  // 创建 keyval exampleCounterFlow: Flow<Int> = dataStore.data.map { preferences ->preferences[EXAMPLE_COUNTER] ?: 0
}

要注意,exampleCounterFlow 是一个 Flow,是一个冷流,map 只是一个数据转换,所以,想要真正获取数据还需要调用 collect:

        dataStore.data.map { preferences ->preferences[EXAMPLE_COUNTER] ?: 0}.collect {println("EXAMPLE_COUNTER 的值:$it")}

清除全部数据

        dataStore.edit {it.clear()}

SharedPreferences 兼容

Preferences DataStore 还提供一种方式,将 SharedPreferences 里面的数据迁移到 Preferences DataStore 中。

首先,我们先来回顾下 SharedPreferences

写入数据:

        getSharedPreferences("old_data", MODE_PRIVATE).edit().apply {putString("name", "不近视的猫")apply()}

文件生成:

文件内容:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map><string name="name">不近视的猫</string>
</map>

下面就是通过 SharedPreferencesMigration 进行 SharedPreferences 的迁移了:

val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "new_data",produceMigrations = { context ->listOf(SharedPreferencesMigration(context, "old_data"))})

当然,直接这样声明是不会进行运行的,需要稍微使用到 dataStore:

        GlobalScope.launch {dataStore.edit {  }}

然后我们就能看到 old_data.xml 文件被删除了,而被取代的是 /data/data/com.bjsdm.testkotlin/files/datastore/new_data.preferences_pb

Preferences DataStore全解析相关推荐

  1. Go modules基础精进,六大核心概念全解析(下)

    Go 语言做开发时,路径是如何定义的?Go Mudules又为此带来了哪些改变?本文将会全面介绍Go Modules六大核心概念,包括了设计理念与兼容性原则等,掌握这些技术点对于管理和维护Go 模块有 ...

  2. 第四章:Spring项目文件上传两种方式(全解析)

    欢迎查看Java开发之上帝之眼系列教程,如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系.本系列教程希望您能站在上帝 ...

  3. 阿里秋招面试全解析(含内推岗)

    每个技术人都有个大厂梦,我觉得这很正常,并不是饭后的谈资而是每个技术人的追求.像阿里.腾讯.美团.字节跳动.京东等等的技术氛围与技术规范度还是要明显优于一些创业型公司/小公司,如果说能够在这样的公司锻 ...

  4. Apache Web服务器访问控制机制全解析

    Apache Web服务器访问控制机制全解析 原文请见: http://netsecurity.51cto.com/art/201102/245666.htm Linux下的Aapche服务器提供了强 ...

  5. 6.15 Unity引擎渲染效率全解析

    UWA新晋主播赵福恺从Unity渲染模块中的各种渲染效果性能.PBR渲染性能以及阴影的渲染性能三个角度分别进行了详细的分析总结.为响应各大听众的需求,小编奉上完整视频回顾,同时也向看完直播才下班的五好 ...

  6. python读取txt文件写入-Python读写txt文本文件的操作方法全解析

    一.文件的打开和创建 >>> f = open('/tmp/test.txt') >>> f.read() 'hello python! hello world! ...

  7. jQuery Ajax 实例 全解析(转)

    jQuery Ajax 实例 全解析 jQuery确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯. 废话少说,直接进入正题,我 ...

  8. Fragment全解析系列

    文/YoKey(简书作者) 原文链接:http://www.jianshu.com/p/d9143a92ad94 著作权归作者所有,转载请联系作者获得授权,并标注"简书作者". F ...

  9. 万物之始正则表达式全解析三部曲(中篇)-正则表达式运算符优先级及匹配规则

    前言 各位小伙伴大家好,接下来几天时间,我会从多个角度对正则表达式进行系统阐述,让你了解正则表达式的前世今生. 该系列文章上篇 万物之始正则表达式全解析三部曲(上篇)-正则表达式基础知识及语法 以下是 ...

  10. 机器学习算法源码全解析(三)-范数规则化之核范数与规则项参数选择

    前言 参见上一篇博文,我们聊到了L0,L1和L2范数,这篇我们絮叨絮叨下核范数和规则项参数选择.知识有限,以下都是我一些浅显的看法,如果理解存在错误,希望大家不吝指正.谢谢. 机器学习算法源码全解析( ...

最新文章

  1. 斜率小于0的连线数量 51Nod - 1107 (树状数组+离散化)
  2. 8大行业场景!最新 Apache Flink 行业案例集火热出炉
  3. 坐地铁可以刷学生卡吗_在沈阳办的公交卡能刷地铁吗?是学生卡,卡上写的是盛京通...
  4. 实作 ASP.NET 多笔数据离线编辑
  5. 中国电信天翼云进入4.0阶段 打造一朵无处不在的分布式云
  6. python壁纸数据抓取_python 多线程爬取壁纸网站的示例
  7. iOS——常用的手势总结
  8. 瞎搞无人机之无刷电机
  9. 卖油的都开始卖菜了,打败你的往往不是对手
  10. 伤害世界服务器连接失败_伤害世界服务器怎么架设_伤害世界服务器架设图文教程_玩游戏网...
  11. w ndows7怎么安装,《联想Y460在Wndows7系统下完美安装XP系统的方法.doc
  12. Jstate JVM分析
  13. 阿里QuickBi快速上手
  14. iQunix F60机械键盘使用评价(精准踩雷)
  15. 专利申请流程及费用,需要准备什么材料,已更新
  16. php curl 小偷,问问小偷无验证码文件(需要空间支持php-curl模块)
  17. linux shell 端口占用,linux 查看端口占用命令实例详解
  18. 又一家大数据软件公司上市:把亚马逊和微软当对手
  19. Docker hub镜像加速
  20. rk3399安装linux的USB没法用,[RK3399] Type-C改为普通USB

热门文章

  1. 微软产品居然出现中文兼容问题
  2. 科特斯matlab求积公式,牛顿科特斯求积公式.ppt
  3. PS学习笔记之色彩模式
  4. 从996的大讨论看劳资博弈的历史
  5. 大数据平台开发公司有哪些?
  6. 给买车的来点干货——汽车品牌分析
  7. 今日头条关键词文章热度和搜索指数的查询方法分享
  8. skiplist及Java实现
  9. Windows优化远程连接速度
  10. 纯c语言设计的打字母游戏代码,纯c语言编写的打字游戏代码