Android DataStore Proto存储接入流程详解与使用

news2024/10/2 8:24:58

一、介绍

        通过前面的文字,我们已掌握了DataStore 的存储,但是留下一个尾巴,那就是Proto的接入。

Proto是什么?

Protobuf,类似于json和xml,是一种序列化结构数据机制,可以用于数据通讯等场景,相对于xml而言更小,相对于json而言解析更快,支持多语言

官网:Language Guide (proto 3) | Protocol Buffers Documentation

二、AndroidStudio加入Proto流程

1、项目build引入tools:

classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.8'

 

2、module引入插件:

apply plugin: 'com.google.protobuf'

 

3、在module的build文件进行配置

3.1指定proto文件目录

sourceSets {
    main {
        proto {
            //指定proto文件位置,你的proto文件放置在此文件夹中
            srcDir 'src/main/proto'
        }

    }

}

 

3.2引入依赖库

implementation 'com.google.protobuf:protobuf-java:3.5.1'
implementation 'com.google.protobuf:protoc:3.5.1'
implementation "com.suning.oneplayer:commonutils:1.10.30"

3.3.在build最外层加入proto节点

protobuf {
    protoc {
        artifact = 'com.google.protobuf:protoc:3.5.1' // 也可以配置本地编译器路径
    }

    generateProtoTasks {
        all().each { task ->
            task.builtins {
                remove java
            }
            task.builtins {
                java {}// 生产java源码
            }
        }
    }
}

注意:直接新增protobuf,这个和android以及dependencies是评级。

3.4在main文件夹下新建一个proto的文件夹

 

 这样,我们已完成了proto接入android的流程。

三、Proto如何对象的创建

先简单的看下一个小demo:

syntax = "proto3";

message SearchRequest {
  string query = 1;
  int32 page_number = 2;
  int32 result_per_page = 3;
}

解释:

syntax = "proto3";指定语言版本

message SearchRequest 定义一个消息

string 和int32是参数类型

从下到下参数后面都被指向了序列号,这些后面在序列化的时候的顺序。

数据类型:

.proto TypeNotesJava/Kotlin Type[1]
doubledouble
floatfloat
int32Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead.int
int64Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead.long
uint32Uses variable-length encoding.int[2]
uint64Uses variable-length encoding.long[2]
sint32Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s.int
sint64Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s.long
fixed32Always four bytes. More efficient than uint32 if values are often greater than 228.int[2]
fixed64Always eight bytes. More efficient than uint64 if values are often greater than 256.long[2]
sfixed32Always four bytes.int
sfixed64Always eight bytes.long
boolboolean
stringA string must always contain UTF-8 encoded or 7-bit ASCII text, and cannot be longer than 232.String
bytesMay contain any arbitrary sequence of bytes no longer than 232.ByteString

 新增:repeated

repeated 在proto的语法类似List

repeated Person list=1,类似list<Person>
 

头部扩展:

syntax:指定proto的版本,protobuf目前有proto2和proto3两个常用版本,如果没有声明,则默认是proto2.

package:指定包名。

import:导入包,类似于java的import.

java_package:指定生成类所在的包名

java_outer_classname:定义当前文件的类名,如果没有定义,则默认为文件的首字母大写名称

message:定义类,类似于java class;可以嵌套repeated:字段可以有多个内容(包括0),类似于array
 

枚举:enum 

enum Corpus {
  CORPUS_UNSPECIFIED = 0;
  CORPUS_UNIVERSAL = 1;
  CORPUS_WEB = 2;
  CORPUS_IMAGES = 3;
  CORPUS_LOCAL = 4;
  CORPUS_NEWS = 5;
  CORPUS_PRODUCTS = 6;
  CORPUS_VIDEO = 7;
}

proto也支持枚举,如上面所示,枚举也要指定tag索引序列号

默认值:

  1. 对于字符串,默认值为空字符串。
  2. 对于字节,默认值为空字节。
  3. 对于布尔值,默认值为false。
  4. 对于数字类型,默认值为零。
  5. 对于枚举,默认值是第一个定义的枚举值,该值必须为0。
  6. 对于消息字段,未设置该字段。它的确切值取决于语言。有关详细信息,请参阅生成的代码指南。

小试牛刀:

定义一个Settings.proto

syntax = "proto3";

option java_package = "com.example.wiik.testdemo.proto";
option java_multiple_files = true;
message Settings {
  int32 example_counter = 1;
  string name=2;
}

 

这样我们就完成了proto对象的创建。

如何引用prtot对象创建:

        val set=Settings.newBuilder().setName("name").setExampleCounter(1).build()
        set.name
        set.exampleCounter

这样我们就完成对象的创建。

四、总结

        关于如何使用proto的语法,这边文章不予过多介绍。如果需要的,可以前往官网学习。这样DataStore proto的存储已形成闭环。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/352605.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【taichi】在Window10上从源码编译太极(用于AOT)

准备工作 Visual studio 2022 建议勾选以下几个&#xff1a; 建议取消中文语言包&#xff0c;只选英文的&#xff08;因为中文有几率会出现BUG&#xff09; 说明&#xff1a;C游戏开发是为了UE AOT用的。 vulkan也是UE AOT要用的。 vulkan貌似不需要显示安装&#xff0c;只…

使用docker-compose部署RocketMQ5.0

简介&#xff1a;使用docker-compose部署rocketmq5.0。文中会介绍docker-compose版本以及需要注意的项第一步&#xff1a;进入hub.docker.com搜索rocketmq我们选择第一个&#xff0c;因为第一个是7个月前更新的&#xff0c;&#xff08;我看有很多博客使用的依旧是最下面的那种…

家政服务小程序实战教程14-立即预约功能开发

上一篇我们开发了客服功能&#xff0c;本篇我们开始开发预约功能。 1 创建数据源 功能开发之前先需要考虑数据源的规划问题&#xff0c;顾客预约某项服务时&#xff0c;需要告知上门时间、联系地址、联系电话&#xff0c;如果需要注明的事项&#xff0c;还需要标明备注。 先…

Vue 双向绑定原理

Vue2 双向绑定原理 mvvm 双向绑定&#xff0c;采用数据劫持结合发布者-订阅者模式的方式&#xff0c;通过 Object.defineProperty() 来 劫持各个属性的 setter、getter&#xff0c;在数据变动时发布消息给订阅者&#xff0c;触发相应的监听回调。 几个要点&#xff1a; 1&#…

分享82个HTML电脑主机模板,总有一款适合您

分享82个HTML电脑主机模板&#xff0c;总有一款适合您 82个HTML电脑主机模板下载链接&#xff1a;https://pan.baidu.com/s/13DGOCgvbxSksMPwJzi2z0g?pwdl0mi 提取码&#xff1a;l0mi Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 云虚拟主机运营商网站模板…

C语言返回类型为指针的一些经典题目(下)

续上一篇文章&#xff0c;上一篇文章题目都很经典&#xff0c;这一篇也不例外。一.返回类型为指针经典题目(下)1.代码(第六题)char *GetMemory3(int num) {char *p (char *)malloc(sizeof(char) * num);return p; } void Test3(void) {char *str NULL;str GetMemory3(100…

应用部署初探:6个保障安全的最佳实践

在之前的文章中&#xff0c;我们了解了应用部署的阶段以及常见的部署模式&#xff0c;包括微服务架构的应用应该如何部署等基本内容。本篇文章将介绍如何安全地部署应用程序。 安全是软件开发生命周期&#xff08;SDLC&#xff09;中的关键部分&#xff0c;同时也需要成为 S…

Java反序列化——CommonsCollections中基础知识

一、CC链总结图二、常见类1、Map类 --> TransformedMapMap类是存储键值对的数据结构。 Apache Commons Collections中实现了TransformedMap &#xff0c;该类可以在一个元素被添加/删除/或是被修改时(即key或value&#xff1a;集合中的数据存储形式即是一个索引对应一个值&a…

2022年Q4业绩超预期,被严重低估的Roku迎来反弹

在资本市场上&#xff0c;Roku应该是流媒体领域最具戏剧性的公司。它曾经被突发的疫情推向股价顶峰&#xff0c;但很快又随着疫情结束跌入谷底。 2022年对于Roku来说&#xff0c;仍然是继续探底的一年。随着股价跌回疫情发生前的水平&#xff0c;争论也开始越来越激烈&#xf…

spring-web HandlerMethodArgumentResolver 源码分析

HandlerMethodArgumentResolver 的使用处&#xff0c;解析参数 org.springframework.web.method.support.InvocableHandlerMethod#getMethodArgumentValues HandlerMethodArgumentResolver 在解析参数时使用&#xff0c;以下是使用处 InvocableHandlerMethod#getMethodArgume…

面试题----集合

概述 从上图可以看出&#xff0c;在Java 中除了以 Map 结尾的类之外&#xff0c; 其他类都实现了 Collection 接⼝。 并且&#xff0c;以 Map 结尾的类都实现了 Map 接⼝List,Set,Map List (对付顺序的好帮⼿)&#xff1a; 存储的元素是有序的、可重复的。 Set (注重独⼀⽆⼆…

2.Telegraf简介

Telegraf简介 Telegraf是Influx公司一款基于插件化的开源指标收集工具.主要结合时序性数据库进行使用,用于性能监控.通常Telegraf会每间隔一段时间抓取一批指标数据并将数据发送给时序性数据库或其他自定义的Output. 官方文档 https://docs.influxdata.com/telegraf/v1.24 与…

分享7个比B站更刺激的老司机网站,别轻易点开

俗话说摸鱼一时爽&#xff0c;一直摸一直爽&#xff0c;作为一个程序员老司机了&#xff0c;一头乌黑浓密的头发还时不时被同事调侃&#xff0c;就靠这10个网站让我健康生活&#xff0c;不建议经常性使用&#xff0c;因为还有一句俗话&#xff0c;那就是“摸鱼一时爽&#xff0…

22- 隐马尔科夫HMM (NLP自然语言算法) (算法)

HMM模型 : from hmmlearn.hmm import GaussianHMM model GaussianHMM(n_components3,n_iter100000, covariance_type diag) model.fit(X) 1、马尔科夫链 有向图模型&#xff08;贝叶斯网络&#xff09;&#xff1a;用有向图表示变量间的依赖关系&#xff1b; 无向图模型&…

【GlobalMapper精品教程】051:融合Dissolve操作详解

本节讲解globalmapper中融合Dissolve工具的使用。 文章目录 一、工具介绍1. 工具位置2. 融合工具二、案例实战1. 加载实验数据2. 根据字段分组融合案例一:根据地类名称分组,将相同的类型融合到一起。案例二:根据权属地类名称分组,将相同的类型融合到一起。一、工具介绍 1.…

UE4 手把手教你做插件(1) 从代码引用插件

0&#xff0c;前言 我看的是 技术宅阿棍儿 的视频&#xff0c;B站有。 系列视频&#xff1a;从代码引用插件_哔哩哔哩_bilibili 看不懂&#xff0c;只能边查资料边看&#xff0c;讲的顺序有点乱 1&#xff0c;根据视频提示创建第三方插件 注意&#xff1a;如果只有空白插件的情…

如何从手工测试进阶自动化测试?阿里10年测开经验分享...

随着行业的竞争加剧&#xff0c;互联网产品迭代速度越来越快&#xff0c;QA 与测试工程师都需要在越来越短的测试周期内充分保证质量。可是&#xff0c;App 测试面临着很多挑战&#xff0c;比如多端发布、多版本发布、多机型发布等等&#xff0c;导致了手工测试很难完全胜任。因…

使用yolov5和强化学习训练一个AI智能欢乐斗地主(一)

这里写自定义目录标题项目介绍项目过程介绍训练yolov5目标检测斗地主收集数据集yolov5调参项目介绍 你好&#xff01; 欢迎阅读我的文章&#xff0c;本章将介绍&#xff0c;如何使用yolov5和强化学习训练一个AI斗地主&#xff0c;本项目将分为三个部分&#xff0c;其中包含&am…

一篇搞懂Mock测试

1. 什么是Mock测试 mock测试就是在测试过程中&#xff0c;对于某些不容易构造或者不容易获取的对象/数据/场景&#xff0c;用一个虚拟的对象来创建以便测试的测试方法。 2. Mock测试常见场景 无法控制第三方系统接口的返回&#xff0c;返回的数据不满足要求依赖的接口还未开…

DEM数据下载——以地理空间数据云为例

数字高程模型&#xff08;Digital Elevation Model)是进行地形分析的重要基础&#xff0c;诸如坡度、坡向及水文分析等都在此基础上进行。今天&#xff0c;我们一起来聊一聊一种DEM数据常见下载方式。按照惯例&#xff0c;先将网址列出&#xff1a;https://www.gscloud.cn/home…