前言

  1. 本篇主要介绍Proto DataStore的内容。
  2. 如果还不了解DataStore,请参考上篇一文了解DataStore(Preferences)
  3. 本篇会涉及到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)相关推荐

  1. Android Jetpack组件DataStore之Proto与Preferences存储详解与使用

    一.介绍 Jetpack DataStore 是一种数据存储解决方案,允许您使用协议缓冲区存储键值对或类型化对象.DataStore 使用 Kotlin 协程和 Flow 以异步.一致的事务方式存储数 ...

  2. Android Jatpack DataStore使用详解

    简介 Jetpack DataStore 是一种数据存储解决方案,允许您使用协议缓冲区存储键值对或类型化对象.DataStore 使用 Kotlin 协程和流程以异步.一致的事务方式存储数据. 如果您 ...

  3. 使用 Jetpack DataStore 进行数据存储

    Jetpack DataStore 是一种数据存储解决方案,允许您使用协议缓冲区存储键值对或类型化对象.DataStore 使用 Kotlin 协程和流程以异步.一致的事务方式存储数据. 如果您当前使 ...

  4. linux nDPI 协议检测 源码分析

    关于nDPI的基本功能就不在这介绍了,有兴趣了解的读者可以阅读官方的快速入门指南:https://github.com/ntop/nDPI/blob/dev/doc/nDPI_QuickStartGu ...

  5. protobuffer

    caffe 里面贯穿始终的文件格式就是protobuffer和glog了,不得不佩服,google确实很牛啊,恭维的话不说,熟悉一下protobuffer吧.其中官方文档什么的,网上搜吧,还有一系列别 ...

  6. Cosmos 基础 -- Ignite CLI(一)

    Ignite CLI v0.26.1 官网 DOC GitHub Try Ignite CLI online 你的项目值得拥有自己的区块链. Ignite使开发.增长和启动区块链项目比以往任何时候都更 ...

  7. 【NDPI】源码解析之深度包检测分析(一)

    (Albert.2019.4.28) 文章目录: 前言: 正文: 一.nDPI深度包检测流程: 二.重要结构体的源码分析 1.ndpi_ethdr.ndpi_iphdr.ndpi_tcphdr.ndp ...

  8. Kratos Quick Start

    一.查看Kratos官方文档以及源码 ​ Kratos源码 Kratos官方文档 ​ 查看如下路径,创建新的项目 创建新项目 Required go protoc protoc-gen-go 二.In ...

  9. java面试题集中了好几篇的搜索的

    1.servlet执行流程 客户端发出http请求,web服务器将请求转发到servlet容器,servlet容器解析url并根据web.xml找到相对应的servlet,并将request.resp ...

  10. php把proto解析为文档,Protobuf 文件生成工具 Prototool 命令详解

    Protobuf 文件生成工具 Prototool 命令详解 简介 Prototool 是 Protobuf 文件的生成工具, 目前支持go, php, java, c#, object c 五种语言 ...

最新文章

  1. 统计学习笔记(4)——朴素贝叶斯法
  2. Acwing 第 2场热身赛 【完结】
  3. 【杂谈】如何从数据准备,模型设计与调优,训练到部署完成整个深度学习算法流程...
  4. access 更新整列数据_在access中同一列的多个数据一次更新
  5. Spring Boot中的Properties
  6. unity5.x Translate平移移动 以及GetComponent获取组件
  7. 火力发电厂与变电站设计防火标准_真题—火力发电厂1
  8. postman-常见问题解决方案记录
  9. java元素定位div_Java+Selenium元素定位的练习(三)
  10. jenkins 脚本编写_使用Jenkins 2编写以代码形式编写管道和实现DevOps的简介
  11. 【我看Spring】从一个简单的AOP示例看切面编程
  12. 让博客园博客自动生成章节目录索引
  13. 通达信资金净流入公式_通达信当天净流入公式,通达信资金净流入公式
  14. 整站下载工具webHttracker webside copier
  15. java 字符串占位符动态替换值工具类
  16. 隔段时间网络就会变差,重启路由器恢复,这是为什么
  17. python输入个人所得税计算_个人所得税编程python
  18. 推荐几个常用的Python扩展工具包
  19. 分门别类刷leetcode——二叉树和图(C++实现)
  20. UE4 Decal实现简介

热门文章

  1. 数据分析几大常见效应和定律。
  2. 基于算力驱动、数据与功能协同的分布式动态(协同)渲染/功能运行时
  3. WPF DataGrid的列标题样式设计
  4. linux关闭防火墙安装Vmware tools
  5. pr如何处理音效,如何让你的声音变得干净又清晰?PR音频降噪教程
  6. 题解 SP4487 【GSS6 - Can you answer these queries VI】
  7. react-native 修改app应用名称
  8. android让字体左右对齐,Android 实现文字左右对齐
  9. 论文引用图片时的版权声明(Reproduced with permission, courtesy of [copyright owner])
  10. 编译报错【error】dexpreopt.sh:23 exited with status 1