首页 > 其他分享 >Android DataStore Proto框架存储接入AndroidStudio教程详解与使用

Android DataStore Proto框架存储接入AndroidStudio教程详解与使用

时间:2023-04-11 10:32:04浏览次数:60  
标签:java protobuf proto Proto encoding AndroidStudio CORPUS Android than


一、介绍

        通过前面的文字,我们已掌握了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'


Android DataStore Proto框架存储接入AndroidStudio教程详解与使用_kotlin

2、module引入插件:


apply plugin: 'com.google.protobuf'


Android DataStore Proto框架存储接入AndroidStudio教程详解与使用_android_02

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

3.1指定proto文件目录


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


Android DataStore Proto框架存储接入AndroidStudio教程详解与使用_kotlin_03

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源码 } } } }


Android DataStore Proto框架存储接入AndroidStudio教程详解与使用_kotlin_04


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


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

Android DataStore Proto框架存储接入AndroidStudio教程详解与使用_java_05

 这样,我们已完成了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 Type

Notes

Java/Kotlin Type[1]

double

double

float

float

int32

Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead.

int

int64

Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead.

long

uint32

Uses variable-length encoding.

int[2]

uint64

Uses variable-length encoding.

long[2]

sint32

Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s.

int

sint64

Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s.

long

fixed32

Always four bytes. More efficient than uint32 if values are often greater than 228.

int[2]

fixed64

Always eight bytes. More efficient than uint64 if values are often greater than 256.

long[2]

sfixed32

Always four bytes.

int

sfixed64

Always eight bytes.

long

bool

boolean

string

A string must always contain UTF-8 encoded or 7-bit ASCII text, and cannot be longer than 232.

String

bytes

May 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;
}

Android DataStore Proto框架存储接入AndroidStudio教程详解与使用_java_06

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

如何引用prtot对象创建:

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

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

四、总结

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

标签:java,protobuf,proto,Proto,encoding,AndroidStudio,CORPUS,Android,than
From: https://blog.51cto.com/u_16065093/6182725

相关文章

  • Android Jetpack组件之WorkManager高级概念介绍与使用(三)
    一、介绍        通过前面两篇,我们基本掌握了组件的workmanager的接入,以及api的使用等。但是一个框架如果运用在复杂的项目中,肯定需要有其他额外的支持,介绍来我们将会介绍高级概念,以及对前面的知识点进行回顾与拓展。高级概念一、配置和初始化        默认情况下,当......
  • Android Imageview 图片置灰,图片特殊节日去真彩色
    ImageViewImageView是Android中的一个图片显示控件,用来加载网络或者本地图片资源。好看的图片可以让应用更被用户接收,如果图片作为应用的装饰,已成为主流,但不是所有的图片显示都符合要求,比如一些特殊时间,特别靓丽的色彩不符合当下假日要求,这个时候如果能让图片变成灰色,这样用助于达......
  • Android 学习任务缩略图
    运行环境1、下面案例在系统签名下可以运行版本:Android112、注意:我尝试在没有系统签名下打开//代码中FilexmlFile=newFile("/data/system_ce/0/recent_tasks/33_task.xml");会报以下错误2023-04-1016:23:38.2784411-4438/com.example.myapplicationW/Sys......
  • Android开发中Dialog填充满父容器
    Android开发中Dialog填充满父容器在Android原生开发中,通常会使用自定义的Dailog来设计二级面板,其自带一个黑色透明的遮蔽效果。但是想要将Dialog填充满父容器,是需要一些尝试的。环境介绍自定义Dialog类,加载自定义布局layout并进行数据绑定,同时创建接口进行信息传递。其中布局......
  • Android开发_记事本(7)
    搜索实现搜索图标的添加main_menu<itemandroid:id="@+id/action_search"android:icon="?attr/menu_search"app:showAsAction="always"app:actionViewClass="androidx.appcompat.widget.SearchView"android:title......
  • Android开发_记事本(6)
    删除键的功能实现删除当前笔记文件EditActivity中添加@OverridepublicbooleanonOptionsItemSelected(MenuItemitem){//监听状态栏上内容被点击switch(item.getItemId()){caseR.id.delete:newAlertDialog.Builder(EditActivity.this)/......
  • Android开发_记事本(3)
    适配器NoteAdapter相当于数据和ListView之间的中介 packagecom.example.note; ​ importandroid.content.Context; importandroid.content.SharedPreferences; importandroid.preference.PreferenceManager; importandroid.text.TextUtils; importandroid.view.Vie......
  • Android开发_记事本(4)
    BaseActivity用作大多数页面的父类 packagecom.example.note; ​ //用来当作大多是activity的superclass ​ ​ importstaticandroid.provider.ContactsContract.Intents.Insert.ACTION; ​ importandroid.app.StatusBarManager; importandroid.content.Broadcas......
  • Android开发_记事本(5)
    菜单栏在res目录下新建文件夹menu,并在该目录下新建main_menu.xml  若要在栏里面加图片则需要引入drawable中的东西新建矢量图菜单栏按钮    再新建主页面删除所有按钮和编辑界面的删除当前笔记的按钮  main_menu <?xmlversion="1.0"encoding="utf......
  • Qt for Android QtQuick应用程序 USB连接手机调试运行错误:adb: failed to *.apk: No s
    1.场景Windows11、Qt6.5.0QtQuick应用程序USB连接手机调试运行。2.错误信息adb:failedto*.apk:NosuchfileordirectoryInstallingtodevicefailed!进程"C:\Users\Administrator\Qt\6.5.0\mingw_64\bin\androiddeployqt.exe"退出,退出代码16。安装应用失败,发生未知错......