Jetpack DataStore

2023-12-22 15:04
文章标签 jetpack datastore

本文主要是介绍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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/524419

相关文章

Android JetPack ViewModel 源码解析

是什么? ViewModel 用来存储页面相关的数据,当页面销毁的时候,存储数据也会清楚。但是当页面发生旋转的时候,并不会清楚数据。 怎么用? UserViewModel userViewModel = new ViewModelProvider(this).get(UserViewModel.class); UserViewModel 是自己写的ViewModel,就可以

Android JetPack Lifecycle源码解析

是什么? JetPack Lifecycle是一个页面(Activity/Fragment)生命周期的组件,当你想监听生命周期,那么就可以使用这个组件。 怎么用? 第一种: getLifecycle().addObserver(new LifecycleObserver() {@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)publi

Android经典实战之存储方案对比:SharedPreferences vs MMKV vs DataStore

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点 在 Android 开发中,键值对存储(Key-Value Storage)是一种经常用到的轻量级数据存储方案。它主要用于保存一些简单的配置数据或状态信息,例如用户设置、缓存数据等。 常见的键值对存储方案 1、 SharedPreferences: 一个轻量级的持久

.[datastore@cyberfear.com].mkp勒索病毒数据怎么处理|数据解密恢复

导言: 在当今数字化时代,随着信息技术的飞速发展,网络安全威胁也日益严峻。勒索软件,作为一类专门设计用于加密受害者数据并要求支付赎金以解锁数据的恶意软件,已成为网络安全领域的一大挑战。近期,[datastore@cyberfear.com].mkp、[henderson@cock.li].mkp 、[hudsonL@cock.li].mkp 、[myers@airmail.cc].mkp勒索病毒

Jetpack架构组件_ViewModel组件_1.简介和示例

1.简介        ViewModel是我们MVVM中的VM层,ViewModel类似于MVP中的P层,它是我们View层和Model层之间的一个桥梁。 1.1 和MVP的P层的主要区别是: (1)ViewModel是与我们Android系统挂钩的,是官方的一个类,MV之间的一个桥梁。 (2)ViewModel还保持数据。 1.2 Android为什么要引入ViewModel?

安卓开发中的Jetpack Compose

本文内容总结自郭神的jetpack compose专栏 ,整理自学,未完持续... 一、了解Jetpack Compose         Compose是一个由Google Android团队官方推出的声明式UI框架,Compose也是属于AndroidX的一部分,它的本质就是用来编写界面以及处理与用户交互相关的逻辑的,来代替传统的View用xml来定义UI的方法。         传统

jetpack compose的@Preview和自定义主题

1.@Preview @Preview可以在 Android Studio 的预览窗口中实时查看和调试 UI 组件。 基本使用 import androidx.compose.foundation.layout.fillMaxSizeimport androidx.compose.material.MaterialThemeimport androidx.compose.material

jetpack compose 在两个页面间切换

jetpack compose 在两个页面间切换: 创建两个Compose页面:定义两个简单的Composable函数,分别代表两个页面。 import androidx.compose.foundation.layout.Arrangementimport androidx.compose.foundation.layout.Columnimport androidx.compose.

Android开发系列(五)Jetpack Compose之Icon Image

Icon是用于在界面上显示矢量图标的组件。它提供了很多内置的矢量图标,也支持自定义图标。要使用Icon组件,可以通过指定图标资源的名称或引用来创建一个Icon对象。例如,使用Icons.Default.Home来创建一个默认风格的首页图标。可以通过设置图标的大小、颜色、和点击事件等属性来自定义Icon的外观和行为。     Image是用于在界面上显示位图图像的组件。它支持从本地资源、网络

【ai】tx2-nx 查看 jetpack 版本信息及对应的tritonserver

3 jtop nvidia@tx2-nx:~$ jtop[WARN] Board missing UNKNOWN (press CTRL + Click)nvidia@tx2-nx:~$ 点击info 可以看到 jetpack是4.6opencv 是4.1.1 5.1.2 的不适合我 tritonserver2.35.0-jetpack5.1.2-update-2.tgz