当前位置: 首页 > news >正文

DataStore快速上手1-preference

DataStore 概念

DataStore 可以存储两种类型的数据,一种是 preference,一种是 protobuf

每个进程在同一时间内仅能打开一个 DataStore 实例(或者通过其他管理手段来实现多个 DataStore 交替使用)

一个 DataStore 可以视为一张数据表


默认存储位置:data/data/com.xxx.xxx/files/datastore/xxx.pb


快速上手

导入依赖:implementation "androidx.datastore:datastore-preferences:1.0.0"


目标

将三个属性 name、age、habit 按照键值对的方式使用 preference 模式存储到本地

实现查询功能


datastore 主文件

新建文件 DataStoreInit.kt 用来初始化 DataStore

首先需要确定 DataStore 的名字,或者可以理解为这个数据表的名字

并使用 kotlin 特有的扩展方法的语法,直接把 dataStore 绑定在全局上下文,即可“一次初始化全局使用”

// 定义DataStore名字
private const val BASIC_DB_NAME = "basic_test"// 全局委托实例化DataStore,接收一个参数,即名字
private val Context.dataStore by preferencesDataStore(name = BASIC_DB_NAME)

我们需要在外部定义键的类型

xxxPreferencesKey 其中的 xxx 代表类型

// 直接定义一组类型时最好这样写
private object PreferencesKeys{// 变量名(大写字符)为开发时使用的键名// 括号内的名字为存储到本地的键名val BASIC_NAME = stringPreferencesKey("basic_name")val BASIC_AGE =  stringPreferencesKey("basic_age")val BASIC_HABIT = stringPreferencesKey("basic_habit")
}

直接定义一个数据类,方便我们后续直接提取出三个数据!

data class basicModel(val name:String,val age:String,val habit:String)

编写新类 DataStoreInit,他接受一个 context 上下文作为初始化形参

所有的 CRUD 操作都在此类中进行!

class DataStoreInit(private val context: Context) {...
}

读取数据

读取数据时需要使用 trycatch 代码块进行异常捕获

// 下面代码是固定格式,不要纠结
val getBasicDB = context.dataStore.data
.catch {e->// 捕获异常并作出处理if(e is IOException){emit(emptyPreferences())}else{throw e}
}.map {preferences ->// 依据键值对的方式提取出存储的值// 格式:preferences[定义的键名]// ?:类似于三元运算,即左侧取出null则直接使用右侧值替换之val name = preferences[PreferencesKeys.BASIC_NAME] ?: "无名氏"val age = preferences[PreferencesKeys.BASIC_AGE] ?: "inf"val habit = preferences[PreferencesKeys.BASIC_HABIT] ?: "清心寡欲乜有爱好"// 把所有数据存储到数据类并将它返回!basicModel(name, age, habit)
}

写入数据

数据写入需要使用挂起函数(故调用该方法时也要使用协程作用域)

// 挂起函数,接收三个参数作为值输入
suspend fun insertBasicDB(name: String,age: String,habit: String):String{return try {// 依据键值对存储即可context.dataStore.edit {preferences ->preferences[PreferencesKeys.BASIC_NAME] = namepreferences[PreferencesKeys.BASIC_AGE] = agepreferences[PreferencesKeys.BASIC_HABIT] = habit}"基础数据插入成功"}catch (e:Exception){println(e)"基础数据插入失败"}
}

主 UI

主页面配置:三个输入框,加一个插入按钮、一个查询按钮、一个清空表单按钮

功能大体解释:

  1. 判断输入框有任意一个为空,则不允许插入
  2. 根据返回值判断成功与否并弹出 Toast
  3. 使用协程作用域 rememberCoroutineScope 进行读写操作
@Composable
fun DataStoreViewInit(navHostController: NavHostController){// 三个主要变量,记得remembervar name by remember {mutableStateOf("tom")}var age by remember {mutableStateOf("100")}var habit by remember {mutableStateOf("play")}// 定义协程作用域,用于数据读写val scope = rememberCoroutineScope()Column(Modifier.fillMaxHeight().fillMaxWidth(),verticalArrangement = Arrangement.Center,horizontalAlignment = Alignment.CenterHorizontally) {TextField(value = name, onValueChange = {name=it}, label = { Text(text = "用户名")})TextField(value = age, onValueChange = {age=it}, label = { Text(text = "年龄")})TextField(value = habit, onValueChange = {habit=it}, label = { Text(text = "密码")})// 保存数据按钮Button(onClick = {// 判断编辑框均非空if(name!==""&&age!==""&&habit!==""){scope.launch {// 保存数据val res = DataStoreInit(MainContext).insertBasicDB(name, age, habit)DialogUtil(MainContext).showSimpleToast(res)}}else{DialogUtil(MainContext).showSimpleToast("请填完所有信息!!!")}}) {Text(text = "提交信息")}// 查询数据按钮Button(onClick = {try {scope.launch {// 查询数据// 由于挂起函数返回类型为一个flow类型对象,所以使用collect取出值即可DataStoreInit(MainContext).getBasicDB.collect {name = it.nameage = it.agehabit = it.habit}}DialogUtil(MainContext).showSimpleToast("已经取出数据!")}catch (e:Exception){DialogUtil(MainContext).showSimpleToast("完蛋了找不到数据!")}}) {Text(text = "查询信息")}// 清空表单按钮Button(onClick = {name=""age=""habit=""}) {Text(text = "清空表单")}}
}

补上一个我封装的弹出 Toast 的小工具类

class DialogUtil(private val context: Context) {fun showSimpleToast(str:String){Toast.makeText(context,str,Toast.LENGTH_SHORT).show()}
}

相关文章:

DataStore快速上手1-preference

DataStore 概念 DataStore 可以存储两种类型的数据,一种是 preference,一种是 protobuf 每个进程在同一时间内仅能打开一个 DataStore 实例(或者通过其他管理手段来实现多个 DataStore 交替使用) 一个 DataStore 可以视为一张数…...

彻底掌握 MySQL InnoDB 的锁机制

本文是对沈剑大佬锁机制十多篇文章的概括总结,文末有全部链接,还参考了 10 多位其他网友的优秀分享。 1、概要 MySQL 中的锁可以按照粒度分为锁定整个表的表级锁(table-level locking)和锁定数据行的行级锁(row-level locking): 表级锁具有开…...

C++继承

1.继承的概念及定义 1.1继承的概念 继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构&#x…...

动态代理是基于什么原理?

第6讲 | 动态代理是基于什么原理? 编程语言通常有各种不同的分类角度,动态类型和静态类型就是其中一种分类角度,简单区分就是语言类型信息是在运行时检查,还是编译期检查。 与其近似的还有一个对比,就是所谓强类型和弱…...

YOLO-V4经典物体检测算法介绍

在前文我们介绍了YOLO-V1~V3版本都做了哪些事,本文我们继续介绍YOLO-V4版本。YOLO的作者在发表完V3之后,发现YOLO产品被美国军方应用到了很多军事战争当中,这是他所不希望看见的,因此宣布不再继续研究。但历史和科技总是随时间不断…...

angular相关知识点总结

创建 angualr 组件和传值 angular组件其实就是个xxx.component.ts,本质还是ts文件一个html文件 1.创建组件:在Angular中,可以使用命令行工具ng generate component创建一个新组件。例如: ng generate component my-component这将创建一个名…...

大坝安全监测系统:水库“守坝人”!

一、项目背景 随着社会经济的迅速发展,我国水资源利用率越来越高,各类水利水电工规模进一步扩大。在抗洪救灾、水利发电等方面带来巨大的经济和社会效益。但受多种因素影响,大坝的安全问题日益严重。大量工程实践证明,为保证大坝…...

CentOS7安装配置OpenVNP连接远端服务器

在项目当中需要访问一个三方接口及数据库,但是需要在CentOS7服务器上先配置OpenVPN,然后才能连接,现将整体配置过程记录如下。 安装 yum -y install epel-release yum -y install openvpn 查看版本 openvpn --version 配置客户端证书 打开…...

04- Matplotlib数据可视化详解 (数据库)

Matplotlib的亮点: import matplotlib.pyplot as plt # 导包plt.figure(figsize (9, 6) , 设置图片大小plt. plot(x, y), 画图绘制网格线: 线型, 颜色, 透明度plt.grid(linestyle --, color green, alpha0.75) # linestyle: 样式, color: 颜色, alpha: 透明度plt.axis(…...

高性能MySQL -- 查询性能优化

一般来说一个好的程序:查询优化,索引优化,库表结构要同时进行优化。今天我们来讲一下查询优化。 我们需要对MySQL的架构有基本认知,所以这里贴一张图大家看看: 图片来自于《小林coding》 为什么从查询会慢&#xff1…...

Android Binder机制之一(简介)

目录 前言 一、Android 进程间通信方式 二、Binder架构图 三、Binder涉及角色 3.1 Binder驱动 3.2 Binder实体 3.3 Binder引用 3.4 远程服务 3.5 ServiceManager守护进程 四、涉及源码 前言 这是本人第N次看Binder 相关知识了,其实每次看都有新的收获&…...

《SOC芯片研究框架》深度科普,发展趋势、技术特点、产业链一文看懂

片上系统SoC(System on Chip),即在一块芯片上集成一整个信息处理系统,简单来说 SoC芯片是在中央处理器CPU的基础上扩展音视频功能和专用接口的超大规模集成电路,是智能设备的“大脑”。随着半导体工艺的发展&#xff0…...

WebRTC中的ICE

ICE简介 ICE是用于UDP媒体传输的NAT穿透协议(适当扩展也可以支持TCP),它需要利用STUN和TURN协议来完成工作。 STUN协议提供了获取一个内网地址对应的公网地址映射关系(NAT Binding)的机制,并且提供了它们…...

了解webpack

文章目录一、webpack是什么?二、为什么要使用webpack三、webpack的五个核心概念四、安装webpack提示:以下是本篇文章正文内容,下面案例可供参考 一、webpack是什么? 本质上,webpack 是一个用于现代 JavaScript 应用程…...

NoSQL数据库详细介绍

一、NoSQL发展历史 NoSQL 一词最早出现于 1998 年,是 Carlo Strozzi 开发的一个轻量、开源、不提供 SQL 功能的关系数据库。 2009 年,Last.fm 的 Johan Oskarsson 发起了一次关于分布式开源数据库的讨论,来自 Rackspace 的 Eric Evans 再次…...

【2023】华为OD机试真题Java-题目0210-优秀学员统计

优秀学员统计 题目描述 公司某部门软件教导团正在组织新员工每日打卡学习活动,他们开展这项学习活动已经一个月了,所以想统计下这个月优秀的打卡员工。 每个员工会对应一个id,每天的打卡记录记录当天打卡员工的id集合,一共30天。 请你实现代码帮助统计出打卡次数top5的员…...

2023备战金三银四,Python自动化软件测试面试宝典合集

马上就又到了程序员们躁动不安,蠢蠢欲动的季节~这不,金三银四已然到了家门口,元宵节一过后台就有不少人问我:现在外边大厂面试都问啥想去大厂又怕面试挂面试应该怎么准备测试开发前景如何面试,一个程序员成长之路永恒绕…...

2023年实体店做什么比较好赚钱?

2023年实体店做什么比较好赚钱?未来实体店真正能赚的模型是什么?#百收#狂潮老师#千行#干货分享#商业思维 2023年实体店做什么比较好赚钱?...

SpringSecurity前后端分离(一篇就够了)

SpringSecurity前后端分离 从上至下操作,直接上手SpringSecurity 文章目录SpringSecurity前后端分离1、项目环境maven依赖数据库表2、自定义UserService接口3、屏蔽Spring Security默认重定向登录页面以实现前后端分离功能1、实现登录成功/失败、登出处理逻辑1、表…...

Allegro如何用Label Tune功能自动调整丝印到器件中心

Allegro如何用Label Tune功能自动调整丝印到器件中心 在做PCB设计的时候,调整丝印是比较费时的工作,如果需要把整板的丝印位号调整到器件的中心做装配图使用,Allegro的Label Tune功能支持快速把丝印位号居中到器件中心。 以下图为例,快速把所有丝印位号居中 调整前 调整后…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...