news 2026/4/30 21:26:21

【Android 数据】使用 JSON DataStore 实现自定义数据类的持久化存储

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Android 数据】使用 JSON DataStore 实现自定义数据类的持久化存储

一、DataStore 简介

  • Jetpack DataStore 是一种数据存储解决方案,让您可以使用协议缓冲区存储键值对或类型化对象。DataStore使用 Kotlin 协程和 Flow 以异步、一致的事务方式存储数据
  • 使用Preferences DataStore 实现键存储和访问数据。该实现不需要预定义的架构,并且不提供类型安全。它具有类似于 SharedPreferences 的 API,但没有与共享偏好设置相关的缺点。
  • 使用DataStore 可以持久保留自定义类。该实现必须为数据定义架构,并提供 Serializer 以将其转换为可持久保存的格式。可以选择使用 Protocol Buffers、JSON 或任何其他序列化策略。

二、DataStore 使用

1、添加依赖库

  • 使用 JSON 序列化,在 build.gradle.kt 中添加 Kotlin Serialization 依赖库。
  • 添加 DataStore 依赖库。
plugins{kotlin("android")version"2.0.21"kotlin("plugin.serialization")version"2.0.21"}dependencies{// JSON 序列化implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3")// DataStore(Proto or JSON)implementation("androidx.datastore:datastore:1.2.0")}

2、定义数据类

  • 定义需要持久保存的数据类,添加 @Serialization 注释进行序列化。
  • 定义一个实现 Serializer 的类,其中 T 是添加注解的数据类的类型。请务必为该序列化器添加默认值,以便在尚未创建任何文件时使用。
  • DataStore 的泛型类型必须不可变。更改 DataStore 中使用的类型会导致 DataStore 提供的一致性失效,并且可能会造成严重的、难以发现的 bug。
packagecom.android.datastore.datastore.jsonimportandroidx.datastore.core.CorruptionExceptionimportandroidx.datastore.core.Serializerimportkotlinx.coroutines.Dispatchersimportkotlinx.coroutines.withContextimportkotlinx.serialization.Serializableimportkotlinx.serialization.SerializationExceptionimportkotlinx.serialization.encodeToStringimportkotlinx.serialization.json.Jsonimportjava.io.InputStreamimportjava.io.OutputStream@SerializabledataclassSettings(valname:String,valnumber:Int,valisBoy:Boolean,valscore:Int)/** * 自定义序列化器 */objectSettingsSerializer:Serializer<Settings>{overridevaldefaultValue=Settings("Lin",1,false,60)overridesuspendfunreadFrom(input:InputStream):Settings{try{returnJson.decodeFromString<Settings>(input.readBytes().decodeToString())}catch(exception:SerializationException){throwCorruptionException("Unable to read Settings",exception)}}overridesuspendfunwriteTo(t:Settings,output:OutputStream){withContext(Dispatchers.IO){output.write(Json.encodeToString(t).encodeToByteArray())}}}

3、创建 DataStore

  • 使用 dataStore 所创建的属性委托来创建DataStore 实例,其中 T 是可序列化的数据类。
  • 请勿在同一进程中为给定文件创建多个 DataStore 实例,否则会破坏所有 DataStore 功能。如果给定文件在同一进程中有多个有效的 DataStore 实例,DataStore 在读取或更新数据时将抛出 IllegalStateException。
  • fileName 参数会告知 DataStore 使用哪个文件存储数据,文件存储路为:/data/data/<包名>/files/datastore/ 目录下
  • serializer 参数会告知 DataStore 在数据定义时的序列化器类的名称。
  • 使用DataStore.data显示所存储对象中相应属性的 Flow。
  • DataStore 提供了一个updateData() 函数,用于以事务方式更新存储的对象。updateData 为您提供数据的当前状态,作为数据类型的一个实例,并在原子读-写-修改操作中以事务方式更新数据。updateData 代码块中的所有代码均被视为单个事务。
  • 使用DataStore.data.first()进行首次加载数据。
packagecom.android.datastore.datastore.jsonimportandroid.content.Contextimportandroid
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/29 11:37:36

MMD Tools:Blender中强大的MMD资源导入导出插件

MMD Tools&#xff1a;Blender中强大的MMD资源导入导出插件 【免费下载链接】blender_mmd_tools MMD Tools is a blender addon for importing/exporting Models and Motions of MikuMikuDance. 项目地址: https://gitcode.com/gh_mirrors/bl/blender_mmd_tools MMD Too…

作者头像 李华
网站建设 2026/4/29 12:20:50

英雄联盟智能助手终极指南:从游戏痛点出发的完整解决方案

英雄联盟智能助手终极指南&#xff1a;从游戏痛点出发的完整解决方案 【免费下载链接】LeagueAkari ✨兴趣使然的&#xff0c;功能全面的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/LeagueAkari 还在为…

作者头像 李华
网站建设 2026/4/30 7:07:05

OTG主机模式启动电路设计:实战案例详解上拉电阻配置

OTG主机模式启动电路设计&#xff1a;从原理到实战的深度拆解你有没有遇到过这样的场景&#xff1f;一个工业手持终端&#xff0c;插上U盘能读数据&#xff0c;接个扫码枪又能当主机用——同一个USB口&#xff0c;既能“往外发”也能“往里收”。这背后靠的不是魔法&#xff0c…

作者头像 李华
网站建设 2026/4/23 12:37:46

League Akari:让英雄联盟游戏体验更智能的游戏辅助工具

League Akari&#xff1a;让英雄联盟游戏体验更智能的游戏辅助工具 【免费下载链接】LeagueAkari ✨兴趣使然的&#xff0c;功能全面的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/LeagueAkari 您是否曾…

作者头像 李华
网站建设 2026/4/24 12:25:46

PaddlePaddle镜像中使用CUDA 11还是12?版本选择建议

PaddlePaddle镜像中使用CUDA 11还是12&#xff1f;版本选择建议 在深度学习项目从实验室走向生产的今天&#xff0c;一个看似微小的环境配置问题——比如该用CUDA 11还是CUDA 12——往往能决定整个训练任务是顺利跑通&#xff0c;还是卡在安装环节动弹不得。尤其是当你满怀期待…

作者头像 李华
网站建设 2026/4/23 7:52:41

基于SpringBoot+Vue的助农扶贫平台的设计与实现毕设

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。一、研究目的本研究旨在设计并实现一个基于SpringBoot和Vue的助农扶贫平台&#xff0c;以解决我国农村地区在扶贫工作中面临的信息不对称、资源整合困难以及市场对接不畅等问…

作者头像 李华