Android笔记(十九):JetPack DataStore 之 Preferences DataStore

news2025/2/4 22:45:00

Jetpack DataStore 是一种数据存储解决方案,主要适用于小型数据的处理。它可以通过协议缓冲区存储键值对或类型化对象。DataStore 使用 Kotlin 协程和 Flow 以异步、一致的事务方式存储数据。DataStore有两种实现方式(1)Preferences DataStore 和 (2)Proto DataStore.

Preferences DataStore利用键值对实现对简单数据的读写存储。这种方式不需要预定架构,也不确保类型安全。

一、增加依赖库

要使用Preferences DataStore需要在项目模块的build.gradle.kt中增加如下的依赖库:

dependencies {
        ...
	    implementation("androidx.datastore:datastore-preferences:1.0.0")

        // 可选项-用于RxJava2支持
        implementation("androidx.datastore:datastore-preferences-rxjava2:1.0.0")

        // 可选项-用于 RxJava3 支持
        implementation("androidx.datastore:datastore-preferences-rxjava3:1.0.0")
} 

下面通过一个简单的实例来了解Perference DataStore的应用。在这个例子中, 记录当前账号访问的次数。运行效果如下图所示。
在这里插入图片描述

二、定义一个实用类DatastoreUtils

利用该实用类DatastoreUtils实现对数据的读写操作。

class DataStoreUtils(val context:Context){
    //利用preferenceDataStore创建委托来创建Preferences DataStore实例
    private val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name="settings")
    //定义关键字email
    private val EMAIL = stringPreferencesKey("email")
    //定义关键字counter
    private val COUNTER = intPreferencesKey("counter")
    //设置关键字对应存储的email值保存在Flow中
    val emailFlow: Flow<String> = context.dataStore.data.map {
        it[EMAIL]?:""
    }
    //设置关键字对应存储的counter值保存在Flow中
    val counterFlow:Flow<Int> = context.dataStore.data.map{
        it[COUNTER]?:0
    }

    /**
     * 定义挂起函数
     * 设置email账号对应访问应用的次数
     */
    suspend fun storeData(email:String){
        context.dataStore.edit{settings:MutablePreferences->
            val storedEmailValue = settings[EMAIL]?:""
            val storedCounterValue = settings[COUNTER]?:0

            if(storedEmailValue.isBlank()||storedEmailValue!=email) {
                settings[EMAIL] = email
                settings[COUNTER]= 1
            }else{
                settings[COUNTER] = storedCounterValue+1
            }
        }
    }
}

三 、定义界面MainScreen

在界面的组合函数MainScreen中调用DatastoreUtils实现对数据的读取操作。代码如下:

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun MainScreen(dataStoreUtils: DataStoreUtils,modifier:Modifier = Modifier){
    val context = LocalContext.current

    var emailInput by remember{mutableStateOf("guest@eyes.com")}
    var rememberInput by remember{mutableStateOf(false)}
    var content by remember{mutableStateOf("")}

    val scope = rememberCoroutineScope()
    //读取数据
    LaunchedEffect(Unit){
            dataStoreUtils.counterFlow.collect{c:Int->
                dataStoreUtils.emailFlow.collect{account:String->
                    content = "账号:${account}访问次数是:${c}次"
                }
            }
    }
    Column{
        TextField(modifier = Modifier.fillMaxWidth(),
            value = emailInput,
            onValueChange = {it:String->
                emailInput = it
            },
            label ={Text("输入账号")},
            leadingIcon = {
                Icon(imageVector = Icons.Filled.Email,contentDescription = "账号")
            }
        )
        Row{
            Checkbox(checked = rememberInput, onCheckedChange ={
                 rememberInput = it
                 if(rememberInput)
                 scope.launch {
                     //写入数据
                     dataStoreUtils.storeData(emailInput)
                 }
            })
            Text("记住账号")
        }

        if(!emailInput.isBlank())
            Text(text = content ,fontSize=20.sp)

    }
}

说明:因为在应用中,活动界面中只能有一个Preferences DataStore的活动实例,因此在上述代码中对DataStore处理的DatastoreUtils实用类通过传参传递过来。也可以考虑使用单例模式,在整个应用中只有一个处理DataStore的对象实例。

四、定义主活动MainActivity

在主活动中调用主界面。代码如下:

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            ForCourseTheme {
                // A surface container using the 'background' color from the theme
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    MainScreen(DataStoreUtils(this))
                }
            }
        }
    }
}

启动应用,可以在Device Explorer中的data->data目录下找到应用包,在它的下级目录files->datastore的settings.preferences_pb文件中保存键值对数据。如下图所示:
在这里插入图片描述
图1 模拟器中存放的键值对数据

参考文献

DataStore
https://developer.android.google.cn/topic/libraries/architecture/datastore?hl=zh-cn

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

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

相关文章

如何搭建Web自动化测试框架?

在程序员的世界中&#xff0c;一切重复性的工作&#xff0c;都应该通过程序自动执行。「自动化测试」就是一个最好的例子。 随着互联网应用开发周期越来越短&#xff0c;迭代速度越来越快&#xff0c;只会点点点&#xff0c;不懂开发的手工测试&#xff0c;已经无法满足如今的…

Enge问题解决教程

目录 解决问题的一般步骤&#xff1a; 针对"Enge问题"的具体建议&#xff1a; 以下是一些普遍适用的解决问题的方法&#xff1a; 以下是一些更深入的Enge浏览器问题和解决办法&#xff1a; 浏览器性能问题&#xff1a; 浏览器插件与网站冲突&#xff1a; 浏览…

R语言中使用ggplot2绘制散点图箱线图,附加显著性检验

散点图可以直观反映数据的分布&#xff0c;箱线图可以展示均值等关键统计量&#xff0c;二者结合能够清晰呈现数据蕴含的信息。 本篇笔记主要内容&#xff1a;介绍R语言中绘制箱线图和散点图的方法&#xff0c;以及二者结合展示教程&#xff0c;添加差异比较显著性分析&#xf…

Android13 Wifi启动流程分析

Android13 Wifi启动流程分析 文章目录 Android13 Wifi启动流程分析一、正常开关wifi 启动流程1、WifiManager2、WifiServiceImpl3、ActiveModeWarden4、ConcreteClientModeManager5、WifiNative6、WifiVendorHal7、HalDeviceManager8、wifi.cpp 二、重启设备时自动开启wifi流程…

云原生之深入解析基于FunctionGraph在Serverless领域的FinOps的探索和实践

一、背景 Serverless 精确到毫秒级的按用付费模式使得用户不再需要为资源的空闲时间付费。然而&#xff0c;对于给定的某个应用函数&#xff0c;由于影响其计费成本的因素并不唯一&#xff0c;使得用户对函数运行期间的总计费进行精确的事先估计变成了一项困难的工作。以传统云…

亚马逊推出 Graviton4:具有 536.7 GBps 内存带宽的 96 核 ARM CPU

如今&#xff0c;许多云服务提供商都设计自己的芯片&#xff0c;但亚马逊网络服务 (AWS) 开始领先于竞争对手&#xff0c;目前其子公司 Annapurna Labs 开发的处理器可以与 AMD 和英特尔的处理器竞争。本周&#xff0c;AWS 推出了 Graviton4 SoC&#xff0c;这是一款基于 ARM 的…

斩获冠亚军!开源检索引擎Puck闪耀NeurIPS‘2023

近日&#xff0c;备受全球瞩目的国际向量检索大赛 Big-ANN in NeurIPS’23 的排行榜正式公布。百度搜索内容技术团队&#xff0c;以其自研 ANN 检索算法 PUCK 的出色性能表现&#xff0c;成功斩获Streaming Search赛道冠军与Filtered Search赛道亚军。 NeurIPS&#xff08;Con…

Spring项目启动,运行停留在标题处

详情&#xff1a; 原因&#xff1a; yml文件存在问题&#xff0c;比如&#xff1a;在切换生产环境和开发环境的配置文件时&#xff0c;yml名称写错&#xff0c;如下&#xff0c;图&#xff0c;此处多写了一个p。 解决办法&#xff1a; 修改为正确的配置文件&#xff0c;即可。

27、ResNet50处理STEW数据集,用于情感三分类+全备的代码

1、数据介绍 IEEE-Datasets-STEW:SIMULTANEOUS TASK EEG WORKLOAD DATASET &#xff1a; 该数据集由48名受试者的原始EEG数据组成&#xff0c;他们参加了利用SIMKAP多任务测试进行的多任务工作负荷实验。受试者在休息时的大脑活动也在测试前被记录下来&#xff0c;也包括在其…

Java 中的内部类的定义

目录 一、成员内部类 二、静态内部类 三、局部内部类 四、匿名内部类 一、成员内部类 public class InnerClass {String name;private Integer age;static String hobby;/*** 成员内部类* 1、成员内部类中只能定义非静态属性和方法* 2、成员内部类中可以访问外部类的成员&a…

【深度学习实践】换脸应用dofaker本地部署

本文介绍了dofaker换脸应用的本地部署教程&#xff0c;dofaker支持windows、linux、cpu/gpu推理&#xff0c;不依赖于任何深度学习框架&#xff0c;是一个非常好用的换脸工具。 本教程的部署系统为windows 11&#xff0c;使用CPU推理。 注意&#xff1a; 1、请确保您的所有路…

晋江IP影视化频频折戟,网文陷入工业化困境

在影视行业进入IP时代的2023年&#xff0c;晋江文学城&#xff08;以下简称晋江&#xff09;IP影视化却迎来了大溃败。 2023年&#xff0c;晋江IP在影视行业依旧十分抢手&#xff0c;多部热门网文被影视化&#xff0c;其中不乏头部视频网站的S大制作&#xff0c;但播出效果却有…

.NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式

之前写过使用自定义返回类的方式来统一接口数据返回格式&#xff0c;.Net Core webapi RestFul 统一接口数据返回格式-CSDN博客 但是这存在一个问题&#xff0c;不是所有接口会按照定义的数据格式返回&#xff0c;除非每个接口都返回我们自定义的类&#xff0c;这种实现起来不…

Mybatis-plus动态条件查询QueryWrapper的函数用法

目录 前言1. QueryWrapper2. 函数3. Demo 前言 原本都是在Mapper文件中修改&#xff0c;直到看到项目中使用了QueryWrapper这个函数&#xff0c;大致了解了用法以及功能&#xff0c;发现还可以&#xff01; 对此此贴为科普帖以及笔记帖 1. QueryWrapper MyBatis-Plus 是 My…

你知道海外云手机可以用于外贸测评吗?

目前随着外贸行业的发展&#xff0c;像亚马逊、速卖通、eBay等海外电商平台越来越火热。在这些平台&#xff0c;过硬的产品质量、优秀的服务、合适的价格&#xff0c;再加上适量的跨境电商测评&#xff0c;很容易就能吸引不少的客户。那么如何利用海外云手机进行外贸测评&#…

rk3588多模型检测部署quickrun

quickrun 是一款rk3588 rknn多模型高效高并发部署软件 软件框架 采用session思想&#xff0c;可以定义多个session满足不同模型的义务需求。比如充电桩检测&#xff0c;垃圾分类&#xff0c;悬崖检测&#xff0c;模型共用一个摄像头&#xff0c;采用yolov5的模型。 采用消息…

【C语言】动态内存管理基础知识——动态通讯录,如何实现通讯录容量的动态化

引言 动态内存管理的函数有&#xff1a;malloc,calloc,ralloc,free,本文讲解动态内存函数和使用&#xff0c;如何进行动态内存管理,实现通讯录联系人容量的动态化&#xff0c;对常见动态内存错误进行总结。 ✨ 猪巴戒&#xff1a;个人主页✨ 所属专栏&#xff1a;《C语言进阶》…

【大模型】快速体验百度智能云千帆AppBuilder搭建知识库与小助手

文章目录 前言千帆AppBuilder什么是千帆AppBuilderAppBuilder能做什么 体验千帆AppBuilderJava知识库高考作文小助手 总结 前言 前天&#xff0c;在【百度智能云智算大会】上&#xff0c;百度智能云千帆AppBuilder正式开放服务。这是一个AI原生应用开发工作台&#xff0c;可以…

业务逻辑漏洞有哪些?漏洞攻击防御及代码示例

文章目录 简介危害成因攻击防御代码示例1. 未经验证的重要操作2. 认证绕过3. 逻辑时间窗口漏洞4. 负载测试漏洞 修复 业务逻辑漏洞是指软件或系统的逻辑设计上的缺陷&#xff0c;这些缺陷可能被攻击者利用&#xff0c;从而导致意料之外的行为。下面是对业务逻辑漏洞的简介、危害…

大数据技术基本功-数据采集

产品指南&#xff5c;DataScale自定义采集器功能介绍产品指南&#xff5c;开发 DataScale Collector​​​​​​​