一文了解DataStore(Proto)
前言
- 本篇主要介绍Proto DataStore的内容。
- 如果还不了解DataStore,请参考上篇一文了解DataStore(Preferences)
- 本篇会涉及到Protocol Buffers相关的内容,如果不太了解,可以查资料作以了解。
准备工作
1. 插件引入:
plugins {id "com.google.protobuf" version "0.8.17"
}protobuf {protoc {artifact = "com.google.protobuf:protoc:3.14.0"}// Generates the java Protobuf-lite code for the Protobufs in this project. See// https://github.com/google/protobuf-gradle-plugin#customizing-protobuf-compilation// for more information.generateProtoTasks {all().each { task ->task.builtins {java {option 'lite'}}}}}
2. 依赖引入
implementation 'androidx.datastore:datastore:1.0.0'implementation 'androidx.datastore:datastore-preferences:1.0.0'implementation "androidx.datastore:datastore-core:1.0.0"implementation "com.google.protobuf:protobuf-javalite:3.18.0"
3. proto编写及编译
- proto文件目录src/main/proto
- proto内容如下:
#固有的 使用proto3
syntax = "proto3";
# 固有 将edu.test.demo改为自己的包名
option java_package = "edu.test.demo";
option java_multiple_files = true;# 内容定义 UserPreferences 为类名
# 字段格式为 类型 字段名 = 编号 ,注意此处编号需要唯一。
message UserPreferences {string name = 1;int32 age = 2;float weight = 3;float tall = 4;int32 sex = 5;
}
- 完成之后进行编译项目,即可生成相关的文件,生成文件以下目录:
app/build/generated/source/proto/debug/包名/
如下图所示:
4. 编写序列化类
代码如下:
object UserPreferencesSerializer:Serializer<UserPreferences> {override val defaultValue: UserPreferencesget() = UserPreferences.getDefaultInstance()override suspend fun readFrom(input: InputStream): UserPreferences {try {return UserPreferences.parseFrom(input)} catch (exception: InvalidProtocolBufferException) {throw CorruptionException("Cannot read proto.", exception)}}override suspend fun writeTo(t: UserPreferences, output: OutputStream) {t.writeTo(output)}
}
其他补充:
自定义编译生成文件路径:
- 在protobuf闭包内添加如下配置,则生成的文件会在响应的目录,如"$projectDir/src/main"会在目录src/main/debug/java/包名/下生成
generatedFilesBaseDir = "$projectDir/src/main"
如果要自定义多个则需要写多个proto文件,编译会生成多个相关文件。
代码如下:
syntax = "proto3";option java_package = "edu.test.demo";
option java_multiple_files = true;message DataPreference{string info = 1;int32 order = 2;
}
则生成的文件如下图,做了生成文件路径配置
开始使用
1. 扩展定义
const val DATA_STORE_USER_FILE_NAME = "user_prefs.pb"
val Context.userDataStore : DataStore<UserPreferences> by dataStore(fileName = DATA_STORE_USER_FILE_NAME,serializer = UserPreferencesSerializer
)
2. 使用
代码如下:
val user = userDataStore.data.first()Log.d(TAG.TAG, "user is ${user.name}")Log.d(TAG.TAG, "user is ${user.age}")Log.d(TAG.TAG, "user is ${user.sex}")Log.d(TAG.TAG, "user is ${user.tall}")Log.d(TAG.TAG, "user is ${user.weight}")//更新userDataStore.updateData {it.toBuilder().setName("张三").setAge(16).setSex(1).setWeight(65.0f).setTall(175.0f).build()}//读取val userUpdate = userDataStore.data.first()Log.d(TAG.TAG, "userUpdate is ${userUpdate.name}")Log.d(TAG.TAG, "userUpdate is ${userUpdate.age}")Log.d(TAG.TAG, "userUpdate is ${user.sex}")Log.d(TAG.TAG, "userUpdate is ${user.tall}")Log.d(TAG.TAG, "userUpdate is ${userUpdate.weight}")
日志如下:
2022-08-05 14:14:51.227 4324-4349/edu.test.demo D/Test-TAG: user is
2022-08-05 14:14:51.227 4324-4349/edu.test.demo D/Test-TAG: user is 0
2022-08-05 14:14:51.227 4324-4349/edu.test.demo D/Test-TAG: user is 0
2022-08-05 14:14:51.227 4324-4349/edu.test.demo D/Test-TAG: user is 0.0
2022-08-05 14:14:51.227 4324-4349/edu.test.demo D/Test-TAG: user is 0.0
2022-08-05 14:14:51.258 4324-4350/edu.test.demo D/Test-TAG: userUpdate is 张三
2022-08-05 14:14:51.258 4324-4350/edu.test.demo D/Test-TAG: userUpdate is 16
2022-08-05 14:14:51.258 4324-4350/edu.test.demo D/Test-TAG: userUpdate is 0
2022-08-05 14:14:51.258 4324-4350/edu.test.demo D/Test-TAG: userUpdate is 0.0
2022-08-05 14:14:51.258 4324-4350/edu.test.demo D/Test-TAG: userUpdate is 65.0
分析:
- 可以看出在未设置值之前,默认对象是可以读出来的,string的默认值为空,int32为0,float为0.0.
- 在设置值之后我们读取到的就是设置的最新值。
补充:
- 其实我们可以看到生成的datastore文件,目录是data/data/包名/files/datastore/,如下图所示:
使用补充,如果要使用多个自定义类型
- 需要多个proto文件,上面已经做了说明,同时需要多个序列化生成器。
- 会生成多个相关类,上面已经做了说明。
- 扩展及使用方式都一样,也会生成多个存储文件,如下图所示:
总结
- 本篇主要对Proto DataStore的使用及注意事项做了介绍。
- 本篇演示了Proto DataStore的简单使用过程。
一文了解DataStore(Proto)相关推荐
- Android Jetpack组件DataStore之Proto与Preferences存储详解与使用
一.介绍 Jetpack DataStore 是一种数据存储解决方案,允许您使用协议缓冲区存储键值对或类型化对象.DataStore 使用 Kotlin 协程和 Flow 以异步.一致的事务方式存储数 ...
- Android Jatpack DataStore使用详解
简介 Jetpack DataStore 是一种数据存储解决方案,允许您使用协议缓冲区存储键值对或类型化对象.DataStore 使用 Kotlin 协程和流程以异步.一致的事务方式存储数据. 如果您 ...
- 使用 Jetpack DataStore 进行数据存储
Jetpack DataStore 是一种数据存储解决方案,允许您使用协议缓冲区存储键值对或类型化对象.DataStore 使用 Kotlin 协程和流程以异步.一致的事务方式存储数据. 如果您当前使 ...
- linux nDPI 协议检测 源码分析
关于nDPI的基本功能就不在这介绍了,有兴趣了解的读者可以阅读官方的快速入门指南:https://github.com/ntop/nDPI/blob/dev/doc/nDPI_QuickStartGu ...
- protobuffer
caffe 里面贯穿始终的文件格式就是protobuffer和glog了,不得不佩服,google确实很牛啊,恭维的话不说,熟悉一下protobuffer吧.其中官方文档什么的,网上搜吧,还有一系列别 ...
- Cosmos 基础 -- Ignite CLI(一)
Ignite CLI v0.26.1 官网 DOC GitHub Try Ignite CLI online 你的项目值得拥有自己的区块链. Ignite使开发.增长和启动区块链项目比以往任何时候都更 ...
- 【NDPI】源码解析之深度包检测分析(一)
(Albert.2019.4.28) 文章目录: 前言: 正文: 一.nDPI深度包检测流程: 二.重要结构体的源码分析 1.ndpi_ethdr.ndpi_iphdr.ndpi_tcphdr.ndp ...
- Kratos Quick Start
一.查看Kratos官方文档以及源码 Kratos源码 Kratos官方文档 查看如下路径,创建新的项目 创建新项目 Required go protoc protoc-gen-go 二.In ...
- java面试题集中了好几篇的搜索的
1.servlet执行流程 客户端发出http请求,web服务器将请求转发到servlet容器,servlet容器解析url并根据web.xml找到相对应的servlet,并将request.resp ...
- php把proto解析为文档,Protobuf 文件生成工具 Prototool 命令详解
Protobuf 文件生成工具 Prototool 命令详解 简介 Prototool 是 Protobuf 文件的生成工具, 目前支持go, php, java, c#, object c 五种语言 ...
最新文章
- 统计学习笔记(4)——朴素贝叶斯法
- Acwing 第 2场热身赛 【完结】
- 【杂谈】如何从数据准备,模型设计与调优,训练到部署完成整个深度学习算法流程...
- access 更新整列数据_在access中同一列的多个数据一次更新
- Spring Boot中的Properties
- unity5.x Translate平移移动 以及GetComponent获取组件
- 火力发电厂与变电站设计防火标准_真题—火力发电厂1
- postman-常见问题解决方案记录
- java元素定位div_Java+Selenium元素定位的练习(三)
- jenkins 脚本编写_使用Jenkins 2编写以代码形式编写管道和实现DevOps的简介
- 【我看Spring】从一个简单的AOP示例看切面编程
- 让博客园博客自动生成章节目录索引
- 通达信资金净流入公式_通达信当天净流入公式,通达信资金净流入公式
- 整站下载工具webHttracker webside copier
- java 字符串占位符动态替换值工具类
- 隔段时间网络就会变差,重启路由器恢复,这是为什么
- python输入个人所得税计算_个人所得税编程python
- 推荐几个常用的Python扩展工具包
- 分门别类刷leetcode——二叉树和图(C++实现)
- UE4 Decal实现简介
热门文章
- 数据分析几大常见效应和定律。
- 基于算力驱动、数据与功能协同的分布式动态(协同)渲染/功能运行时
- WPF DataGrid的列标题样式设计
- linux关闭防火墙安装Vmware tools
- pr如何处理音效,如何让你的声音变得干净又清晰?PR音频降噪教程
- 题解 SP4487 【GSS6 - Can you answer these queries VI】
- react-native 修改app应用名称
- android让字体左右对齐,Android 实现文字左右对齐
- 论文引用图片时的版权声明(Reproduced with permission, courtesy of [copyright owner])
- 编译报错【error】dexpreopt.sh:23 exited with status 1