Android Jetpack 之DataStore 学习笔记

Android DataStore 使用详解 Jetpack DataStore 是一种数据存储解决方案,允许您使用协议缓冲区存储键值对或类型化对象。DataStore 使用 Kotlin 协程和 Flow 以异步、一致的事务方式存储数据。 阅读详情

DataStore definition

One of the primary benefits of DataStore is the asynchronous API.aimed at replacing SharedPreferences.Data is stored asynchronously, consistently, and transactionally, overcoming most of the drawbacks of SharedPreferences.

另外,DataStore能存储基本的键值对,也能存储数据对象类型。

0.Setup

//添加依赖

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

1.Preferences DataStore(SharedPreferences)

  • Create a Preferences DataStore
// At the top level of your kotlin file:
val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "settings")
  • Read from a Preferences DataStore
val EXAMPLE_COUNTER = intPreferencesKey("example_counter")
val exampleCounterFlow: Flow<Int> = context.dataStore.data
  .map { preferences ->
    // No type safety.
    preferences[EXAMPLE_COUNTER] ?: 0
}
  • Write to a Preferences DataStore
suspend fun incrementCounter() {
  context.dataStore.edit { settings ->
    val currentCounterValue = settings[EXAMPLE_COUNTER] ?: 0
    settings[EXAMPLE_COUNTER] = currentCounterValue + 1
  }
}

2.Proto DataStore

  • 在build.gradle(:app)添加如下设置
plugins {
    id "com.google.protobuf" version "0.8.12"
}
android{
    sourceSets {
        main {
            proto {
                // proto 文件默认路径是 src/main/proto
                // 可以通过 srcDir 修改 proto 文件的位置
                srcDir 'src/main/proto'
            }
        }
    }
}
dependencies{
    implementation "androidx.datastore:datastore-core:1.0.0"
    implementation "com.google.protobuf:protobuf-javalite:3.10.0"
}
protobuf {
    protoc {
        artifact = "com.google.protobuf:protoc:3.10.0"
    }

    // Generates the java Protobuf-lite code for the Protobufs in this project. See
    // https://github.com/google/protobuf-gradle-plugin#customizing-protobuf-compilation
    // for more information.
    generateProtoTasks {
        all().each { task ->
            task.builtins {
                java {
                    option 'lite'
                }
            }
        }
    }
    // 默认生成目录 $buildDir/generated/source/proto 通过 generatedFilesBaseDir 改变生成位置
    // generatedFilesBaseDir = "$projectDir/src/main"
}
  • Define a schema

在src/main/proto/创建一个.proto文件内容如下:

syntax = "proto3";
//包名+文件名
option java_package = "com.example.application";
option java_multiple_files = true;

message Settings {
  int32 example_counter = 1;
}
  • Create a Proto DataStore
//定义proto类的序列化器
object SettingsSerializer : Serializer<Settings> {
  override val defaultValue: Settings = Settings.getDefaultInstance()

  override suspend fun readFrom(input: InputStream): Settings {
    try {
      return Settings.parseFrom(input)
    } catch (exception: InvalidProtocolBufferException) {
      throw CorruptionException("Cannot read proto.", exception)
    }
  }

  override suspend fun writeTo(
    t: Settings,
    output: OutputStream) = t.writeTo(output)
}
//定义datastore对象
//The filename parameter tells DataStore which file to use to store the data
val Context.settingsDataStore: DataStore<Settings> by dataStore(
  fileName = "settings.pb",
  serializer = SettingsSerializer
)
  • Read from a Proto DataStore
val exampleCounterFlow: Flow<Int> = context.settingsDataStore.data
  .map { settings ->
    // The exampleCounter property is generated from the proto schema.
    settings.exampleCounter
  }
  • Write to a Proto DataStore
suspend fun incrementCounter() {
  context.settingsDataStore.updateData { currentSettings ->
    currentSettings.toBuilder()
      .setExampleCounter(currentSettings.exampleCounter + 1)
      .build()
    }
}

Migrate from SharedPreferences to DataStore

val dataStore: DataStore<Preferences> = context.createDataStore(
    name = "settings",
    migrations = listOf(SharedPreferencesMigration(context, "settings_preferences"))
)

SharedPreferences vs DataStore

Room vs DataStore

If you have a need for partial updates, referential integrity, or support for large/complex datasets, you should consider using Room instead of DataStore. DataStore is ideal for small, simple datasets and does not support partial updates or referential integrity.

https://android-developers.googleblog.com/2020/09/prefer-storing-data-with-jetpack.html

Blogs

相关学习资料

[210308更新!]持续更新的Android & Android Jetpack & Material Design & Material Design Component(MDC)入门学习笔记 这是我第一次写有关Android的文章,甚至是第一篇有关编程的文章,所以我打算将这个文章作为持续更新的文章,算是学习笔记吧。希望我的文章能给屏幕前的你有所帮助。你可以选择耐心的全部看完,或者点击目录看你想看到的章节。无论是哪种,各位可以选择收藏这篇文章,我应该会持续更新的。 目录写在前面相关资料写代码得有个好习惯等等,Java?Kotlin?从最基础的布局开始:ConstraintLayout 1.0必须使用的绑定组件工具:ViewBinding最强大的列表控件:RecyclerView现代化的设计模式:M 阅读详情

相关推荐

Android Jetpack组件 DataStore的使用和简单封装

下面我们再写一个取数据的方法。: “新冠” }.first()你会发现和存数据又有不同,这里的first()就是取值,这个方法换个方式来看就清晰一些。然后我们在取数据按钮的点击事件中调用。下面我们运行一下:第一次我先取数据,显示的是默认值,然后我存数据再取数据。效果就是这样,但你会觉得使用起来很麻烦,不如SP好用,这个我们后面再去封装,先了解一些它的功能特性。三、数据查看和清除在进行定义dataStore时,会在手机中生成一个pb文件,这里我们用虚拟机来看,然后通过你的程序包名去找。

lingyued的博客 1186

Android Jetpack 组件之DataStore的使用

只需对数据结构化的方式进行一次定义,编译器便会生成源代码,轻松写入和读取结构化数据。我们是配置依赖项的中声明了proto源码地址路径在,在src/main/下新建一个probo包,在其包下新建我们的probo文件:data.proto 的内容如下:如果需要高亮显示 proto 代码,下载 proto 插件/**完成 Gradle 设置后,让我们开始创建包含必填字段的原型文件。在目录app/src/main/下创建一个 proto目录。新建一个名称为 data 扩展名为.proto的文件。

Android/Kotlin/Ktor/Compose 3012

Android Jetpack中DataStore的理解与使用

Android Jetpack中DataStore的理解与使用DataStorePreferences DataStore 和 Proto DataStore设置使用 Preferences DataStore 存储键值对定义架构创建 Proto DataStore从 Proto DataStore 读取内容在同步代码中使用 DataStore DataStore Jetpack DataStore 是一种数据存储解决方案,允许您使用协议缓冲区存储键值对或类型化对象。DataStore 使用 Kotlin

Android、HTML、CSS、JS、JAVA、Kotlin、PHP等技术 2096

Android 使用DataStore的委托方式实现数据存储

Android 使用DataStore的委托方式实现数据存储,通过kotlin的委托方式来简化使用DataStore,让我们可以直接对属性进行get或set值以读取和保存数据。

weixin_45949102的博客 500

Android Jetpack组件 DataStore的使用和简单封装,安卓面试

下面我们再写一个取数据的方法。: “新冠” }.first()你会发现和存数据又有不同,这里的first()就是取值,这个方法换个方式来看就清晰一些。然后我们在取数据按钮的点击事件中调用。下面我们运行一下:第一次我先取数据,显示的是默认值,然后我存数据再取数据。效果就是这样,但你会觉得使用起来很麻烦,不如SP好用,这个我们后面再去封装,先了解一些它的功能特性。三、数据查看和清除在进行定义dataStore时,会在手机中生成一个pb文件,这里我们用虚拟机来看,然后通过你的程序包名去找。

2401_84148955的博客 1136

Jetpack的DataStore存储超级详细教程——Proto DataStore

Jetpack的DataStore存储超级详细教程——Proto DataStore 前言 Proto DataStore使用方法相对Preferences DataStore较为复杂,导入插件和依赖,编写proto文件,编译项目,才可以使用 环境(仅供参考):Android Studio4.1 + kotlin1.3.21 + androidx + 协程 使用步骤 导入插件和依赖(主项目build上添加) 1、导入plugins 插件 plugins { id "com.google.protob

CQ0911的博客 1998

Preferences DataStore使用实例

build.gradle(模块)添加依赖: dependencies { implementation "androidx.datastore:datastore-preferences:1.0.0-beta01" implementation "androidx.datastore:datastore-preferences-rxjava2:1.0.0-beta01" }

u011376563的博客 1415

n8n实战:动态报表生成与企业微信自动化推送

本文详细介绍了如何利用n8n实现动态报表生成与企业微信自动化推送的全流程。通过配置n8n Form触发器、智能报表生成核心逻辑以及企业微信Webhook推送,帮助企业大幅提升数据收集与报表推送效率,实现从数据录入到报表推送的全自动化处理。

weixin_29267307的博客 304

Android Jetpack组件DataStore之Proto与Preferences存储详解与使用

Jetpack DataStore 是一种数据存储解决方案,允许您使用协议缓冲区存储键值对或类型化对象。DataStore 使用 Kotlin 协程和 Flow 以异步、一致的事务方式存储数据。 如果您当前在使用 SharedPreferences 存储数据,请考虑迁移到 DataStore,Datastore在存储安全和性能都是有保障的。

2282

论文阅读-Whisper语音识别(OpenAI)

Whisper 是一个自动语音识别(ASR,Automatic Speech Recognition)系统,OpenAI 通过从网络上收集了 68 万小时的多语言,其中11万小时覆盖96 种语言,12万小时的语言标号为英语,用多任务(multitask)监督数据对 Whisper 进行了训练。

一位不是很硕的鉴伪方向硕士 6366

强化学习(Q-learning、DQN) —— 理论、案例与交互式 GUI 实现

本文详细介绍了强化学习中基于值函数的 Q-learning 算法及深度强化学习的 DQN 方法,从基本理论、数学模型到算法流程均进行了全面阐述。通过迷宫导航、股票交易策略和机器人控制等典型案例,展示了强化学习在处理高维、非线性和时变问题中的强大适应性。为了帮助工程师和研究者更直观地理解强化学习的训练过程,本文还提供了一份基于 Python 与 PyQt6 实现的交互式 GUI 演示系统代码示例,用户可以在线调整参数,实时观察累计奖励和 Q 值的变化,从而更深入地理解算法收敛和策略演化的过程。

闲人编程的博客 1475

Android JetPack学习笔记-DataStore

通过键值对存储,以异步、一致的事务方式存储数据克服了SharedPreferences的一些缺点,基于kotlin协程的Flow实现。并且可以对SP数据进行迁移。以protobuffer协议进行存储,速度更快,效率更高。

FrenkX72的博客 979

博途PLC如何建立与笔记本电脑端的连接?(新手必会)

对S7-1500PLC下载硬件组态或程序,需要建立PC与PLC的连接。 由于S7-1500CPU都具有PN端口,因此建立PC与S7-1500PLC的连接通常使用工业以太网来实现。 1.使用网线连接PC-PLC 使用网线,一端连接PC的以太网卡端口,另一端连接S7-1500CPU的PN端口。 2.设置本机IP地址 2.1 确认本机要设置的IP地址段 本机IP地址要和PLC程序组态IP地址段前三位保持一致,后一位使用组态中没有用到的IP地址段。如下图所示。 那么看了这个图片应该就知道了,地址应该设置成192.

weixin_42430971的博客 1万+

Android开发之数据仓库

Android开发学习笔记。学习DataStore的使用。

u013054484的博客 439

ISO21434 组织网络安全管理(二)

为了实现网络安全工程,该组织建立并维护网络安全治理和网络安全文化,包括网络安全意识管理、能力管理和持续改进。这涉及到指定针对本文档的目标进行独立审计的特定于组织的规则和过程。 为了支持网络安全工程,该组织实施了网络安全的管理系统,包括管理工具和应用质量管理系统。

qq_42357877的博客 1322

07 Zabbix 微信告警

Zabbix 微信告警 1.注册企业微信 企业微信注册地址:https://work.weixin.qq.com 2.进入企业微信后台管理 2.1 添加微信成员 2.2创建应用 2.3 获取四项数据 (1)AgentID (2) Secret (3) 企业ID (4)部门ID 3.Zabbix Server配置 3.1确认脚本目录 # grep alertscripts /etc/zabbix/zabbix_server....

Jian Sun_的博客 1297

Android Jetpack 之 DataStore

Google 推出了 JetPack 的新成员 DataStore,DataStore 是一种新的数据存储方案。DataStore以异步、一致的事务方式存储数据,克服了 SharedPreferences 的一些缺点。 Jetpack DataStore 是经过改进的新版数据存储解决方案,旨在取代 SharedPreferences。DataStore 基于 Kotlin 协程和流程构建而成,提供两种不同的实现: Proto DataStore,它允许您存储类型化的对象(由协议缓冲区提供支持) Pre

接受自己的普通,然后拼尽全力去与众不同 1万+

高速PCB设计中的一些常用规则

目前,高速PCB产品设计中,高速接口的应用日益普及,对于复杂的设计而言,高速走线就如同“蜘蛛网”一样密布在PCB各处,因此,在进行PCB检查及评审时,必要的高速PCB设计经验法则及规则是工程师开展工作必不可少的知识储备。

一只豌豆象的博客 3415

【Android Jetpack】DataStore

目录1. 前言2. 分类2.1 Preferences DataStore 和SharedPreferences的区别3. 实践3.1 Preferences DataStore3.1.1 依赖3.1.2 案例3.1.3 最后3.2 Proto DataStore3.2.1 依赖3.2.1.1 添加协议缓冲区插件3.2.1.2 配置协议缓冲区3.2.2 定义架构3.2.3 简单使用3.2.3.1 创建序列化器3.2.3.2 数据存储和读取 1. 前言 Jetpack DataStore 是一种数据存储解决方

梦否 2371

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Jetpack架构组件库:DataStore

Jetpack DataStore 是一种经过改进的新数据存储解决方案,旨在取代 SharedPreferences。DataStore 基于 Kotlin 协程和 Flow 构建而成,提供以下两种不同的实现: Preferences DataStore 用于键值对存储。数据以异步、一致和事务性的方式存储,有助于避免 SharedPreferences 的一些缺点。此实现不需要预定义的架构,也不确保类型安全。 Proto DataStore 用于存储类型化对象,数据作为自定义数据类型的实例进行存储。此实现

川峰的博客 6万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Jetpack DataStore 你总要了解一下吧?

DataStore是 Android Jetpack 中的一个组件,它是一个数据存储的解决方案,跟SharedPreferences一样,采用key-value形式存储。

帅次的博客 3052

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Android Jetpack系列之DataStore

文章目录DataStore介绍DataStore使用Preferences DataStoreProto DataStoreSharedPreferences缺点SharedPreferences迁移至DataStore总结参考 DataStore介绍 Jetpack DataStore 是一种数据存储解决方案,允许使用协议缓冲区存储键值对或类型化对象。DataStore 使用 Kotlin 协程和 Flow 以异步、一致的事务方式存储数据。 DataStore 以异步、一致的事务方式存储数据,克服了 Sh

小马快跑的博客 3210

Android Jetpack 系列(四)DataStore 数据存储

try {DataStore 是 Google 面向现代 Android 架构推出的响应式本地数据存储方案,它通过协程、Flow 和类型安全特性,为开发者提供更强的能力和更清晰的数据管理模型。但这并不意味着 SharedPreferences 立即过时。两者各有适用场景:如果你正在开发一个新的 MVVM 架构项目,推荐使用 DataStore,它能很好地与 ViewModel、StateFlow 等 Jetpack 组件协同工作,且具有良好的并发与响应式特性。

子云心的博客 1645
上一篇: 解决Android中TextView单行设置过时的问题
下一篇: 两个人的云南之旅
program008
博客等级 码龄11年 5粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值