首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从Android DataStore检索数据并保存到全局变量

基础概念

Android DataStore 是一种用于持久化存储数据的 API,它提供了一种简单、高效的方式来存储和检索键值对数据。DataStore 支持多种数据类型,包括字符串、整数、浮点数、布尔值和二进制数据。它还支持事务性操作,确保数据的一致性和完整性。

优势

  1. 简单易用:DataStore 提供了简洁的 API,使得数据的存储和检索变得非常容易。
  2. 类型安全:DataStore 支持多种数据类型,并且在编译时进行类型检查,减少了运行时错误。
  3. 事务性:DataStore 支持事务性操作,确保数据的一致性和完整性。
  4. 持久化:DataStore 将数据持久化存储在设备上,即使应用关闭或设备重启,数据也不会丢失。

类型

Android DataStore 主要有两种类型:

  1. Preferences DataStore:用于存储简单的键值对数据,通常用于存储用户偏好设置。
  2. Proto DataStore:用于存储使用 Protocol Buffers 定义的数据结构,适用于更复杂的数据存储需求。

应用场景

DataStore 适用于以下场景:

  • 存储用户偏好设置。
  • 存储应用配置信息。
  • 存储用户数据,如用户登录信息、设置等。
  • 存储应用状态信息。

从 DataStore 检索数据并保存到全局变量

假设我们要从 Proto DataStore 中检索数据并保存到全局变量,以下是一个示例代码:

代码语言:txt
复制
import android.content.Context
import androidx.datastore.core.DataStore
import androidx.datastore.dataStore
import com.example.app.data.UserPreferences
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.runBlocking

// 定义全局变量
val globalUserPreferences: UserPreferences? = null

// 初始化 DataStore
val Context.userPreferencesDataStore: DataStore<UserPreferences> by dataStore(
    fileName = "user_preferences.proto"
)

// 从 DataStore 中检索数据并保存到全局变量
fun retrieveUserPreferences(context: Context) {
    runBlocking {
        try {
            val userPreferencesFlow: Flow<UserPreferences> = context.userPreferencesDataStore.data
            val userPreferences = userPreferencesFlow.first()
            globalUserPreferences = userPreferences
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
}

参考链接

Android DataStore 官方文档

遇到的问题及解决方法

问题:无法从 DataStore 中检索数据

原因

  1. DataStore 文件未正确初始化。
  2. 数据文件损坏或格式不正确。
  3. 数据库中没有相应的数据。

解决方法

  1. 确保 DataStore 文件已正确初始化。
  2. 检查数据文件是否损坏,必要时重新创建数据文件。
  3. 确保数据库中有相应的数据,可以通过 DataStore 的 put 方法添加数据。

问题:数据类型不匹配

原因

  1. 存储的数据类型与检索的数据类型不匹配。
  2. 使用了错误的 Protocol Buffers 定义。

解决方法

  1. 确保存储和检索的数据类型一致。
  2. 检查并修正 Protocol Buffers 定义,确保数据结构正确。

通过以上方法,可以有效地从 Android DataStore 中检索数据并保存到全局变量,同时解决常见的数据存储和检索问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用

    使用 Scaffold 时,您可以确保这些组件能够正确放置协同工作。...中,这里我们请求成功之后返回的是epidemicNews,如下图所示: 然后我们增加两行代码: 这里就是拿到数据之后保存到本地数据库中,为什么要先删除呢?...③ 使用   首先先说一下业务逻辑,通过一个缓存值记录当天是否有请求网络API接口,没有请求就从网络中返回数据,然后保存到数据库中,第二次请求这个缓存值就有效果了,那么就从本地数据库中返回数据。..., CODE, listOf(NewslistItem(App.db.newsItemDao().getAll(), null, null))) 一个是保存到数据库,一个是数据库中获取数据,这里是相当于构建了的...,那么再运行一次看看: 数据库中获取了数据

    3K31

    【面试黑洞】Android 的键值对存储有没有最优解?

    正文 这是我在网上找到的一份 Android 键值对存储方案的性能测试对比(数越小越好): 可以看出,DataStore 的性能比 MMKV 差了一大截。...而键值对的存储方案,最传统也最广为人知的就是 Android 自带的 SharedPreferences。它里面的 -Preferences,就是偏好设置的意思,名字也能看出它最初的定位。...DataStore 比人家晚两年发布,可是性能却比人家差一大截?甚至,测试数据来看,它连要被它替代掉的 SharedPreferences 都比不过。这么弱?那它搞个毛啊!...(text) // 显示之前,先保存到磁盘 bubble.setText(text) 那么你想一下,这个「保存到磁盘」的行为,我应该做成同步的还是异步的?...但这就和 MMKV 的定位不符了:因为这种「同步」本质上就是一次存到磁盘的写入,并且是同步的写入;而 MMKV 是要高频写入的,如果在高频写入内存的同时,还要实时地把数据内存同步到磁盘,就会一下子把写入速度内存级别下降到磁盘级别

    1.2K20

    Jetpack组件之DataStore

    首语 数据持久化指将哪些内存中的瞬时数据存到存储设备中,保证即使在手机或电脑关机的情况下,数据依然不会丢失。 Android系统中主要提供了三种方式来实现数据持久化功能。...即文件存储、SharedPreferences存储及数据库存储。其中SharedPreferences是使用键值对的方式来存储轻量型数据,使用比较简单,且程序卸载后也会一清除,不会残留数据。...Jetpack DataStore 是一种数据存储解决方案,允许您使用协议缓冲区存储键值对或类型化对象。DataStore 使用 Kotlin 协程和 Flow 以异步、一致的事务方式存储数据。...plugins { id "com.android.application" id "kotlin-android" id "com.google.protobuf" version...protobuf { protoc { // //仓库下载 protoc 这里的版本号需要与依赖 com.google.protobuf:protobuf-javalite:xxx

    1.2K10

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

    正文   DataStore是Jetpack中的一个组件,用于做数据持久化,DataStore以异步、一致的事务方式存储数据,克服了SharedPreferences的一些缺点,DataStore基于Kotlin...二、数据存取   首先我们改一下activity_main.xml布局,里面的代码如下: <LinearLayout xmlns:android="http://schemas.android.com/...android:layout_height="wrap_content" android:text="存数据" /> <Button android:id="@...五、对象存取   其实我们刚才使用的是Preferences DataStore,是对数据进行操作,下面要操作的是Proto DataStore,官网上的说法是Proto DataStore数据作为自定义数据类型的实例进行存储...) 这里就用到了那个序列化器,然后会保存到study.pb下,下面来看存和取的方法,代码如下: //proto 存数据 binding.btnProtoPut.setOnClickListener

    3.7K20

    使用Kubernetes身份在微服务之间进行身份验证

    因此,与其直接向datastore发出请求,不如直接通过身份验证服务,检索令牌使用该令牌对您对datastore的请求进行身份验证。...2.API向datastore进行身份验证的唯一方法是,如果它具有有效的令牌。API使用其凭据授权服务器请求令牌。 ? 1.API向datastore发出请求,附加令牌作为有效身份的证明。 ?...3.第二个应用程序请求中检索令牌,使用Keycloak对其进行验证。4.如果令牌有效,它将回复该请求。...datastore服务执行两项关键操作: 1.它X-Client-Id传入的请求中检索标头的值。2.然后,它调用Kubernetes令牌查看API来检查令牌是否有效。...因此,您将看到API组件如何读取ServiceAccount令牌并将其传递到datastore作为身份验证的一种方式。 datastore服务检索令牌使用Kubernetes API对其进行检查。

    7.9K30

    全网最细解析DataStore,SharedPreferences终结者

    QueuedWork类在Android8.0以上和8.0以下的版本实现方式有区别: 8.0之前QueuedWork.java: public class QueuedWork {     private...这里需要注意一点:不能将上面的初始化代码写到Activity里面去,否则重复进入Actvity使用Preferences DataStore时,会尝试去创建一个同名的.preferences_pb文件...文件读取数据时,如果出现错误,系统会抛出IOExceptions。...id "com.google.protobuf" version "0.8.17" } android {     //.............其他配置..................     ...migrate里指定了下面两个参数: SharedPreferencesView:可以用于 SharedPreferences 中检索数据 BookProto.Book:当前数据 同样地在创建时如果传入了

    1.9K40

    FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势

    该方向的学习难度系数为★★★,饭碗指数为★★。理由:爸爸的App开发技术都是公开的,而且简单易学门槛低。...嗯,学习Jetpack套件与最新的Android开发推荐这本书《Android Studio开发实战:零基础到App上线(第3版)》,该书基于Android12和Android Studio Dolphin...,介绍了包含DataStore、Room、RecyclerView、ViewPager2、WorkManager、Glide、CameraX、ExoPlayer等等在内的Jetpack套件。...具体参见《Android Studio开发实战:零基础到App上线(第3版)》一书的“13.4  即时通信”和“17.3  低功耗蓝牙”。...jvmti、Native层观测技术gdbinjec等等.该方向的学习难度系数为★★★★★,饭碗指数为★★★★。

    13110

    Android开发笔记(一百七十八)更安全的数据仓库DataStore

    为此Android官方推出了数据仓库DataStore,并将其作为Jetpack库的基础组件。...datastore-preferences-rxjava2:1.0.0" 数据仓库的用法类似于共享参数,首先要指定仓库名称,创建仓库实例,示例代码如下: private RxDataStore<Preferences...往数据仓库保存数据的代码示例如下: // 数据仓库中读取信息 private void readDatastore() { DatastoreUtil datastore = DatastoreUtil.getInstance...("update_time")); tv_data.setText(desc); } 数据仓库获取数据的代码示例如下: DatastoreUtil datastore = DatastoreUtil.getInstance...然后打开记录获取界面,看到记录获取结果如下图所示,说明成功实现了数据仓库的读写功能。 点此查看Android开发笔记的完整目录

    1K10

    NLP 论文领读|无参数机器翻译遇上对比学习:效率和性能我全都要!

    写在前面检索式增强在各种自然语言处理任务中被广泛应用,其主要目的是基于一定的检索范式来利用现存数据,影响模型最终得到的结果,从而降低模型参数的负担。...其包含两个主要的步骤:首先是创建数据库(Datastore),也就是使用基础模型来进行正向传播,利用在解码时候映射到词表前的特征和对应的目标词作为键值对存储在 Datastore 中,对应图 1 中 Datastore...正式翻译时,在每个具体的解码步骤中,使用相同位置的特征, Datastore 中进行向量检索,使用检索的结果以及对应的距离(Distances),结合温度超参数来计算得到最终的概率(对应公式 1),将得到的概率作为目标词概率按照一定比例融合到原始模型输出词表的概率分布上...时间延迟 因为 KNN 的向量检索是在每个解码步骤中进行的,随着 Datastore 的增大,向量检索的延迟会严重影响最终整体翻译的速度。...图 3 中也可以看到,不同的簇之间可能是会存在重叠的部分,因此就需要下面的第二个步骤。2. 对比训练。 不同的语义单元应该是互相不重合,因为重合会导致在检索时候的不准确问题,从而影响最终的翻译性能。

    81920

    DataStore —— SharedPreferences 的替代者 ?

    以上吐槽来自 AndroidX 添加的新成员 DataStore 的类注释,地址如下: https://cs.android.com/androidx/platform/frameworks/support...DataStore 提供了一种存储轻量数据的安全稳定的方案,例如配置文件,应用状态等。它不支持局部更新:如果任何一个成员变量被修改了,整个对象都将被序列化持久化到磁盘。...名字就可以看出来,不支持多进程。看一下其中几个关键方法。...具体用法详见官方写的单元测试 SingleProcessDataStoreTest,地址如下: https://cs.android.com/androidx/platform/frameworks/support...---- 今天的文章就到这里了,我是一直坚持原创的秉心说,更多最新 Android 动态,扫码关注我的公众号吧 !

    61020

    DataNucleus JDO基础入门

    DataNucleus JDO 提供了此 JDO 标准的实现,允许您(用户)将面向对象的数据持久保存到该标准的 RDBMS 数据存储中,而且还保存到范围广泛的其他数据存储中。... JDO 映射指南开始 JDO 的使用需要 PersistenceManagerFactory 来访问数据存储。...datanucleus-{datastore}.jar({datastore} 是 ‘rdbms’、’mongodb’、’cassandra’ 等):这为 JAR 所针对的特定类型的数据存储提供了持久性...最后一步很重要,整理与数据存储的任何连接,关闭 PersistenceManager 如果你想从持久存储中检索一个对象,像这样的东西将提供你所需要的。...这使用“查询”,检索价格低于 150.00 的所有 Product 对象,按升序对它们进行排序。

    1.3K20

    Go之Viper

    远程配置系统(etcd或Consul)读取监控配置变化 从命令行参数读取配置 buffer读取配置 显式配置值 为什么选择viper 在构建现代应用程序时,你无需担心配置文件格式;你想要专注于构建出色的软件...而不是pflag检索值 在 Viper 中使用 pflag 并不阻碍其他包中使用标准库中的 flag 包。...这些值的优先级高于默认值,但是会被磁盘、flag或环境变量检索到的配置值覆盖。...Viper使用cryptK/V存储中检索配置,这意味着如果你有正确的gpg密匙,你可以将配置值加密存储自动解密。加密是可选的。...每个人都可以从不同的配置文件,key value存储区等读取数据。每个都可以从不同的配置文件、键值存储等中读取。

    6.4K101

    go语言中的配置管理神器 --viper 一

    它支持:默认配置 JSON, TOML, YAML, HCL 和 Java 属性配置文件读取数据实时查看和重新读取配置文件(可选)环境变量中读取远程配置系统(etcd 或 Consul)读取数据监听变化从命令行参数读取...而不是pflag检索值在 Viper 中使用 pflag 并不阻碍其他包中使用标准库中的 flag 包。...viper 检索值...}Viper获取值在Viper中,有几种方法可以根据值的类型获取值。...每个人都可以从不同的配置文件,key value存储区等读取数据。每个都可以从不同的配置文件、键值存储等中读取。viper包支持的所有功能都被镜像为viper实例的方法。...配置文件发生变化后要同步到全局变量Confviper.OnConfigChange(func(in fsnotify.Event) {fmt.Println("夭寿啦~配置文件被人修改啦...")if

    30721

    Android 逆向】使用 DB Browser 查看修改 SQLite 数据库 ( Android 应用数据目录中拷贝数据库文件 | 使用 DB Browser 工具查看数据块文件 )

    文章目录 一、 Android 应用数据目录中拷贝 SQlite3 数据库文件 二、使用 DB Browser 工具打开 SQlite3 数据库文件 一、 Android 应用数据目录中拷贝 SQlite3...数据库文件 ---- 进入 /data/data/com.qidian.QDReader/databases 目录 , 拷贝 2 个 sqlite3 数据库文件到 sd 卡中 ; cp download.db.../sdcard/Pictures/ cp ywloginmta.db /sdcard/Pictures/ 将 SQlite 数据库文件拷贝到 Windows 文件系统中 , 二、使用 DB Browser...工具打开 SQlite3 数据库文件 ---- 将数据块文件拖动到 DB Browser 工具中 ; 数据库打开成功 ; 右键点击表中的第一个选项 , 选择浏览表 ; 可以查看表中的字段 ;

    2K10

    SAP ETL开发规范「建议收藏」

    这些可以手动输入,数据库导入,或任何支持CWM(Common Warehouse Metamodel)的工具导入。...其次,工作流和数据流可以在多个作业中重复使用,并且通过声明本地变量和参数来中断对作业级别全局变量的依赖,这些全局变量已被配置分配了适当的值。...,尽可能多地在数据库上执行操作。...缓存的比较表 – 该选项的速度与排序的输入选项类似,但这意味着整个比较表将缓存到内存中。 使用“排序输入选项”的关键是确保传入的数据集已排序。...更好的方法是使用Query对象中的Where子句数据库中过滤需要的数据集,然后使用Case变换来拆分数据集并将数据路由到正确的路径。

    2.1K10

    Android MVVM框架搭建(三)MMKV + Room + RxJava2

    Android MVVM框架搭建(三)MMKV + Room + RxJava2 前言 正文 一、添加依赖 二、MMKV 1. 初始化 2. 数据存取 3. 使用 三、Room 1....使用 五、源码 前言   在上一篇文章中,我讲述了怎么在MVVM框架中搭建网络访问框架,通过一个必应的每日壁纸做了一次请求接口的访问演示,这篇文章就需要来讲述Android端的本地数据库的使用和在MVVM...正文   本文说的是数据库,为什么要讲这个呢,因为在实际开发中,有一些数据并不需要实时更新,我们只需要在第一次打开应用的时候获取到,然后保存到手机本地数据库中即可,需要的时候数据库中获取。...二、MMKV   在Android系统中使用了多年的SharedPreferences ,终于被Google给放弃了,在JetPack的新组件中新增了一个DataStore,其实在DataStore出现之前已经有一些第三方的本地缓存处理库了...然后在db包下新建一个bean包,bean包下新建一个Image类,我们可以分析一下需要存到数据库中的值,是否所有数据都要存入,不要做没必要的事情,那是给自己找事。

    1.3K31
    领券