Jetpack DataStore
文章目录
- Jetpack DataStore
- 概述
- DataStore 对比 SP
- 添加依赖库
- Preferences DataStore
- 路径
- 创建 Preferences DataStore
- 获取数据
- 保存数据
- 修改数据
- 删除数据
- 清除全部数据
- Proto DataStore
- 配置
- AndroidStudio安装插件
- 配置proto文件
- 创建序列化器
- 创建 Proto DataStore
- 获取数据
- 保存数据
- 修改数据
- 删除Map数据
- 清除数据
- 代码下载
Jetpack DataStore
概述
Jetpack DataStore 是一种数据存储解决方案,允许您使用协议缓冲区存储键值对或类型化对象。DataStore 使用 Kotlin 协程和 Flow 以异步、一致的事务方式存储数据。
DataStore 提供两种不同的实现:Preferences DataStore 和 Proto DataStore。
- Preferences DataStore 使用键存储和访问数据。此实现不需要预定义的架构,也不确保类型安全。
- Proto DataStore 将数据作为自定义数据类型的实例进行存储。此实现要求您使用协议缓冲区来定义架构,但可以确保类型安全。
DataStore 官方文档
Proto3 语法入门
Proto3 官方语法指南
DataStore 对比 SP
SharedPreference(简称SP) 是一个轻量级的数据存储方式,使用方便,以键值对的形式存储在本地。
SP的缺点:
- SP不能保证类型安全。如果存的数据和取的数据的类型不一致时会报异常。
- SP加载的数据会一直停留在内存中。
- 不支持多进程。
- 读写性能差,可能阻塞UI线程,可能引起ANR。
DataStore优点:
- 读写性能高。基于协程和Flow保证了UI线程的安全性。
- 从一定程度上保证类型安全。
添加依赖库
project/build.gradle
buildscript { dependencies {// Proto DataStoreclasspath 'com.google.protobuf:protobuf-gradle-plugin:0.8.19'}
}
module/build.gradle
plugins {id 'com.android.application'id 'kotlin-android'id 'com.google.protobuf'
}dependencies {// Preferences DataStoreimplementation "androidx.datastore:datastore-preferences:1.0.0"implementation "androidx.datastore:datastore-core:1.0.0"// Proto DataStoreimplementation 'androidx.datastore:datastore-core:1.0.0'implementation 'com.google.protobuf:protobuf-javalite:3.10.0'implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.5.0"}protobuf {protoc {artifact = "com.google.protobuf:protoc:3.14.0"}// 为该项目中的 Protobufs 生成 java Protobuf-lite 代码。generateProtoTasks {all().each { task ->task.builtins {java {option 'lite'}}}}
}
Preferences DataStore
路径
DataStore 生成的缓存文件存放在 /data/data/<包名>/files/datastore
目录下:
创建 Preferences DataStore
val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "user_info")
获取数据
lifecycleScope.launch {dataStore.edit { preferences ->// 先通过 stringPreferencesKey() 方法获取指定Keyval nameKey = stringPreferencesKey("name")val ageKey = intPreferencesKey("age")val sexKey = booleanPreferencesKey("sex")// 通过Key获取值val name = preferences[nameKey]val age = preferences[ageKey]val sex = preferences[sexKey]logE("name:$name age:$age sex:$sex")}
}
保存数据
dataStore.edit { preferences ->preferences[stringPreferencesKey("name")] = "小明"preferences[intPreferencesKey("age")] = 18preferences[booleanPreferencesKey("sex")] = true
}
修改数据
dataStore.edit { preferences ->preferences[stringPreferencesKey("name")] = "小黑"preferences[intPreferencesKey("age")] = 28preferences[booleanPreferencesKey("sex")] = false}
删除数据
dataStore.edit { preferences ->val removeValue = preferences.remove(stringPreferencesKey("name"))logE("remove:$removeValue")
}
清除全部数据
dataStore.edit { preferences ->preferences.clear()
}
Proto DataStore
配置
AndroidStudio安装插件
配置proto文件
先新建 proto 目录:
再创建 person.proto 文件,并写入:
syntax = "proto3";option java_package = "com.example.datastoredemo"; //设置生成的类所在的包
option java_multiple_files = true; //可能会有多个文件。message PersonPreferences {string name = 1; //String类型int32 age = 2; //int类型bool sex = 3; //boolean类型repeated string address = 4; //String[]数组map<string, string> fruits = 5; //Map类型
}
创建序列化器
object PersonSerializer : Serializer<PersonPreferences> {override val defaultValue: PersonPreferencesget() = PersonPreferences.getDefaultInstance()override suspend fun writeTo(t: PersonPreferences, output: OutputStream) {t.writeTo(output)}override suspend fun readFrom(input: InputStream): PersonPreferences {try {return PersonPreferences.parseFrom(input)} catch (exception: InvalidProtocolBufferException) {throw CorruptionException("Cannot read proto.", exception)}}
}
创建 Proto DataStore
val Context.personDataStore: DataStore<PersonPreferences> by dataStore(fileName = "person.pb", serializer = PersonSerializer
)
获取数据
lifecycleScope.launch {personDataStore.data.first().let { preferences ->val name = preferences.nameval age = preferences.ageval sex = preferences.sexval address = preferences.addressListval fruits = preferences.fruitsMaplogE("name:$name age:$age sex:$sex address:$address fruits:$fruits")}
}
保存数据
preferences.toBuilder().setName("小白").setAge(28).setSex(true).addAddress("广东省").addAddress("广州市").addAddress("黄埔区").putFruits("apple", "苹果").putFruits("banner", "香蕉").putFruits("cherry", "樱桃").build()
preferences.toBuilder().setName("小白").setAge(28).setSex(true).addAllAddress(listOf("广东省", "广州市", "黄埔区")).putAllFruits(mapOf("apple" to "苹果", "banner" to "香蕉", "cherry" to "樱桃")).build()
修改数据
personDataStore.updateData { preferences -preferences.toBuilder().setName("小黑").setAge(38).setSex(false).setAddress(0, "湖南省").setAddress(1, "长沙市").setAddress(2, "芙蓉区").putFruits("apple", "苹果1号").build()
}
删除Map数据
personDataStore.updateData { preferences ->preferences.toBuilder().removeFruits("apple") // 删除map数据.build()}
清除数据
personDataStore.updateData { preferences ->// 清除所有数据preferences.toBuilder().clear().build()// 依次清除数据preferences.toBuilder().clearName().clearAge().clearSex().clearAddress().clearFruits().build()
}
personDataStore.updateData { preferences ->// 清除所有数据preferences.toBuilder().clear().build()// 依次清除数据preferences.toBuilder().clearName().clearAge().clearSex().clearAddress().clearFruits().build()
}
代码下载
相关文章:
Jetpack DataStore
文章目录 Jetpack DataStore概述DataStore 对比 SP添加依赖库Preferences DataStore路径创建 Preferences DataStore获取数据保存数据修改数据删除数据清除全部数据 Proto DataStore配置AndroidStudio安装插件配置proto文件创建序列化器 创建 Proto DataStore获取数据保存数据修…...
在Portainer创建Nginx容器并部署Web静态站点实现公网访问
🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,…...
泛微e-cology XmlRpcServlet文件读取漏洞复现
漏洞介绍 泛微新一代移动办公平台e-cology不仅组织提供了一体化的协同工作平台,将组织事务逐渐实现全程电子化,改变传统纸质文件、实体签章的方式。泛微OA E-Cology 平台XmRpcServlet接口处存在任意文件读取漏洞,攻击者可通过该漏洞读取系统重要文件 (如数据库配置…...
当下流行的直播技术demo演示
nginx-http-flv-module(更新不是很频繁) SRS: https://ossrs.net/lts/zh-cn/(独立官网,目前最新稳定版version5) 基于SRS搭建直播demo演示: 一、搭建流媒体服务器 参见官网:https://ossrs.ne…...
Zabbix自动发现并注册已安装agent的主机
先在被监控主机上安装好zabbix-agent 然后登录zabbix网页 点击发现动作后会出现第三步 然后编辑操作,发现后加入到主机组群 然后编辑发现规则 然后就可以在主机列表中看到被发现的主机。...
Jtti:linux搭建开源ldap服务器的方法
搭建开源LDAP服务器是一种用于集中管理用户身份认证和授权信息的方法。在Linux系统上,OpenLDAP是一个流行的开源LDAP实现,可以用于搭建LDAP服务器。以下是搭建OpenLDAP服务器的基本步骤: 步骤一:安装OpenLDAP 安装OpenLDAP软件包&…...
Gazebo GUI模型编辑器
模型编辑器 现在我们将构建我们的简单机器人。我们将制作一个轮式车辆,并添加一个传感器,使我们能够让机器人跟随一个斑点(人)。 模型编辑器允许我们直接在图形用户界面 (GUI) 中构建简单的模型。对于更复…...
pycharm运行正常,但命令行执行提示module不存在的多种解决方式
问题描述 在执行某个测试模块时出现提示,显示自定义模块data不存在,但是在PyCharm下运行正常。错误信息如下: Traceback (most recent call last):File "/run/channelnterface-autocase/testcases/test_chanel_detail.py", line 2…...
GBASE南大通用GBase 8a ODBC的安装文件
GBASE南大通用GBase 8a ODBC 体系结构是基于五个组件,在下图中所示: GBase 8a ODBC 体系结构图 应用 应用是通过调用 ODBC API 实现对 GBase 数据访问的程序。应用使用标准的 ODBC 调用与驱动程序管理器通信。应用并不关心数据存储在哪里ÿ…...
重新配置torch1.8 cuda11.1 torchtext0.9.0虚拟Pytorch开发环境
这里写目录标题 起因发现选择安装cuda 11.1核对下自己的显卡是否支持下载该版本的CUDACUDA下载地址CUDA安装过程 在anaconda中创建一个虚拟环境1.以下是环境的配置过程2.查看虚拟环境列表3.激活虚拟环境 安装torch和torchtext包的过程1.输入下面这句代码,就可以直接…...
【动画图解】一次理清九大排序算法!面试官问到再也不慌!
排序算法 交换排序 冒泡排序快速排序 插入排序 直接插入排序希尔排序 选择排序 简单选择排序堆排序 归并排序基数排序桶排序 一、冒泡排序 冒泡排序是一种简单的交换排序算法,以升序排序为例,其核心思想是: 从第一个元素开始,…...
组播地址段及其作用
作用 组播(Multicast)传输:在发送者和每一接收者之间实现点对多点网络连接。如果一台发送者同时给多个的接收者传输相同的数据,也只需复制一份的相同数据包。它提高了数据传送效率。减少了骨干网络出现拥塞的可能性。 地址段 组播协议的地址在 IP 协议中属于 D 类…...
Vue+ElementUI前端添加展开收起搜索框按钮
1、搜索框添加判断 v-if"advanced" <el-form-item label"创建日期" v-if"advanced"><el-date-pickerv-model"daterangeLedat"size"small"style"width: 240px"value-format"yyyy-MM-dd"type&q…...
速盾网络:sdk游戏盾有什么作用?
速盾cdn是一款非常优秀的CDN加速服务,它能够帮助游戏开发者们提升游戏的性能和稳定性。其中,速盾cdn的sdk游戏盾是其一项非常实用的功能,它能够为游戏提供更加稳定和快速的网络连接。 首先,让我们来了解一下什么是sdk游戏…...
理解BeEF的架构
BeEF的组件和工作原理BeEF(The Browser Exploitation Framework)是一款用于浏览器渗透测试和漏洞利用的强大工具。它由多个组件组成,这些组件协同工作以实现对受害者浏览器的控制和攻击。本文将深入探讨BeEF的各个组件和其工作原理࿰…...
esp32-s3训练自己的数据进行目标检测、图像分类
esp32-s3训练自己的数据进行目标检测、图像分类 一、下载项目二、环境三、训练和导出模型四、部署模型五、存在的问题 esp-idf的安装参考我前面的文章: esp32cam和esp32-s3烧录human_face_detect实现人脸识别 一、下载项目 训练、转换模型:ModelAssist…...
华为设备VRP基础
交换机可以隔离冲突域,路由器可以隔离广播域,这两种设备在企业网络中应用越来越广泛。随着越来越多的终端接入到网络中,网络设备的负担也越来越重,这时网络设备可以通过华为专有的VRP系统来提升运行效率。通用路由平台VRP…...
论文笔记 | ICLR 2023 WikiWhy:回答和解释因果问题
文章目录 一、前言二、主要内容三、总结🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、前言 ICLR 2023 | Accept: notable-top-5%:《WikiWhy: Answering and Explaining Cause-and-Effect Questions》 一段话总结:WikiWhy 是一个新的 QA 数据集,围绕一个新的任务…...
LC24. 两两交换链表中的节点
代码随想录 class Solution {// 举例子:假设两个节点 1 -> 2// 那么 head 1; next 2; next.next null// 那么swapPairs(next.next),传入的是null,再下一次递归中直接返回null// 因此 newNode null// 所以 next.next head; > 2.next 1; 2 -> 1// head.next…...
使用redis-rds-tools 工具分析redis rds文件
redis-rdb-tools安装部署及使用 发布时间:2020-07-28 12:33:12 阅读:29442 作者:苏黎世1995 栏目:关系型数据库 活动:开发者测试专用服务器限时活动,0元免费领,库存有限,领完即止&…...
C# Onnx yolov8 plane detection
C# Onnx yolov8 plane detection 效果 模型信息 Model Properties ------------------------- date:2023-12-22T10:57:49.823820 author:Ultralytics task:detect license:AGPL-3.0 https://ultralytics.com/license version&am…...
Oracle定时任务的创建与禁用/删除
在开始操作之前,先从三W开始,即我常说的what 是什么;why 为什么使用;how 如何使用。 一、Oracle定时器是什么 Oracle定时器是一种用于在特定时间执行任务或存储过程的工具,可以根据需求设置不同的时间段和频率来执行…...
Asp.Net Core 项目中常见中间件调用顺序
常用的 AspNetCore 项目中间件有这些,调用顺序如下图所示: 最后的 Endpoint 就是最终生成响应的中间件。 Configure调用如下: public void Configure(IApplicationBuilder app, IWebHostEnvironment env){if (env.IsDevelopment()){app.UseD…...
【JVM】一、认识JVM
文章目录 1、虚拟机2、Java虚拟机3、JVM的整体结构4、Java代码的执行流程5、JVM的分类6、JVM的生命周期 1、虚拟机 虚拟机,Virtual Machine,一台虚拟的计算机,用来执行虚拟计算机指令。分为: 系统虚拟机:如VMware&am…...
[SWPUCTF 2021 新生赛]Do_you_know_http已
打开环境 它说用WLLM浏览器打开,使用BP抓包,发送到重发器 修改User-Agent 下一步,访问a.php 这儿他说添加一个本地地址,它给了一个183.224.40.160,我用了发现没用,然后重新添加一个地址:X-Forwa…...
hadoop01_完全分布式搭建
hadoop完全分布式搭建 1 完全分布式介绍 Hadoop运行模式包括:本地模式(计算的数据存在Linux本地,在一台服务器上 自己测试)、伪分布式模式(和集群接轨 HDFS yarn,在一台服务器上执行)、完全分…...
【每日一题】得到山形数组的最少删除次数
文章目录 Tag题目来源解题思路方法一:最长递增子序列 写在最后 Tag 【最长递增子序列】【数组】【2023-12-22】 题目来源 1671. 得到山形数组的最少删除次数 解题思路 方法一:最长递增子序列 前后缀分解 根据前后缀思想,以 nums[i] 为山…...
2023年,为什么汽车依然有很多小毛病?
汽车出现小毛病是一个复杂的问题,其原因涉及到汽车本身的设计、制造质量、维护保养以及使用环境等多个方面。只有汽车制造商、车主和社会各界共同努力,才能够减少汽车的小毛病,提高汽车的可靠性和安全性。 比如,汽车的维护和保养…...
yocto系列讲解[实战篇]93 - 添加Qtwebengine和Browser实例
By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 概述集成meta-qt5移植过程中的问题问题1:virtual/libgl set to mesa, not mesa-gl问题2:dmabuf-server-buffer tries to use undecl…...
Python实验报告十一、自定义类模拟三维向量及其运算
一、实验目的: 1、了解如何定义一个类。 2、了解如何定义类的私有数据成员和成员方法。 3、了解如何使用自定义类实例化对象。 二、实验内容: 定义一个三维向量类,并定义相应的特殊方法实现两个该类对象之间的加、减运算(要…...
万能网页视频下载/关键词优化的发展趋势
招我过来的时候说的数通工程师,这是现在让我跟着学习华为的PTN,说实话我都知道是个什么东西,又不让我摸设备,整天在个U2000上点来点去的- -! 问了公司里的同事,PTN说是数通也是数通说是传输也是传输&#x…...
第三方做公司网站/2345网址导航电脑版
sessionid, uuid 2个字段上都有索引,但是查询条件 (sessionidxxx or uuidyyy) 不能使用索引 > 拆成2个sql sessionidxxx, uuidyyy 将查询出来的结果合并 /*** param array $a* param array $b* param callable|NULL $compare* return array*/private function…...
抚州网站网站建设/友链网站
我自己遇到了这个错误,在调查时,我来了一个mailing list post with this info:If you link a shared object containing IE-model access relocs,the objectwill have the DF_STATIC_TLS flag set. By the spec,this means that dlopenmight refuse to load it.查看…...
哪些网站可以找到做海报的素材/百度的链接
🎄🎄近期,小海带在空闲之余收集整理了一批农业作物开源数据集资源供大家参考。 整理不易,小伙伴们记得一键三连喔!!!🎈🎈 一、农作物图像分类(小麦、睡到、甘…...
网站建设的主机/超级外链
PhysX 3.4更新 PhysX 3.4是一个重大更新,对多个方面带来了明显的改进。 首先,PhysX 3.4解决了大量Bug。例如:PhysX 3.4显著改进凸面与凸面间的碰撞检测和反馈,因此当启用PCM碰撞检测时,不会出现任何奇怪的碰撞情况。针…...
网络教育网站建设/如何让别人在百度上搜到自己公司
问题描述 有时候逛技术社区,经常会发现有个叫IRC的东西存在,想搭建下看看到底是个什么东西 说明: 操作系统环境为CentOS6.5_64 安装irc服务器 通过yum进行安装,命令如下: yum install ircd-hybrid.x86_64 ircd-hybrid版…...