Jetpack之DataStore使用

简介: 前言DataStore提供了一种安全且持久的方式来存储少量数据。它不支持部分更新:如果任何字段被修改,整个对象将被序列化并持久到磁盘。它是线程安全的,非阻塞的。特别是,它解决了SharedPreferences这些设计缺陷:同步API鼓励违反StrictModeapply和commit没有发出错误信号的机制apply将阻塞fsync上的UI线程不持久-它可以返回尚未持久的状态没有一致性或事务语义在

前言

DataStore提供了一种安全且持久的方式来存储少量数据。它不支持部分更新:如果任何字段被修改,整个对象将被序列化并持久到磁盘。它是线程安全的,非阻塞的。特别是,它解决了SharedPreferences这些设计缺陷:

  1. 同步API鼓励违反StrictMode
  2. apply和commit没有发出错误信号的机制
  3. apply将阻塞fsync上的UI线程
  4. 不持久-它可以返回尚未持久的状态
  5. 没有一致性或事务语义
  6. 在解析错误是引发运行时异常
  7. 公开对齐内部状态的可变引用

Preferences DataStore

用法

添加依赖

dependencies {
    implementation "androidx.datastore:datastore-preferences:1.0.0"
    implementation "androidx.datastore:datastore-preferences-core:1.0.0"
}

创建Preference DataStore

val Context.datastore: DataStore
    
    
      by preferencesDataStore(name = "test_datastore")
    
    

该方法只应在文件中调用一次(在顶层),并且DataStore的所有用法都应该使用同一个实例的引用。属性委托的接收者类型必须是Context类型。同时会生成一个命名为name..preferences_pb的文件。

存数据

通过edit方法写数据到文件:

lifecycleScope.launch {
    context.datastore.edit {
        it[stringPreferencesKey(key)] = value
    }
}

edit是一个suspend方法,需要在协程里调用,其中key,value是一对键值。

取数据

通过Flow去获取数据:

lifecycleScope.launch {
    context.datastore.data.collect {
        value = it[floatPreferencesKey(key)]
    }
}

value = datastore.data.first()[intPreferencesKey("test_key")]

通过以上俩种方式都可以获得相应key的value值。

Proto DataStore

用法

添加依赖

在app的build.gradle引入protobuf插件:

plugins {
		...
    id "com.google.protobuf" version "0.8.17"
}

android {
		...
    protobuf {
        protoc {
            //protoc版本参见:https://repo1.maven.org/maven2/com/google/protobuf/protoc/
            artifact = "com.google.protobuf:protoc:3.18.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'
                    }
                }
            }
        }
        //修改生成java类的位置 默认是 $buildDir/generated/source/proto
        generatedFilesBaseDir = "$projectDir/src/main/generated"
    }
}

dependencies {
    implementation "androidx.datastore:datastore:1.0.0"
    implementation "com.google.protobuf:protobuf-javalite:3.18.0"
}

定义架构

Proto DataStore要求在app/src/main/proto目录对的proto文件中保存定义的架构。此架构用于在Proto DataStore中保存的对象类型。

syntax = "proto3";

option java_package = "com.example.myapplication";
option java_multiple_files = true;

message MessageEvent {
  int32 type = 1;
  string message = 2;
}

创建Proto DataStore

1.定义一个实现Serializer 的类,其中T是proto文件中定义的类型;

2.使用由datastore创建的属性委托来创建DataStore 对象

object MessageEventSerializer : Serializer
    
    
      {

    override val defaultValue: MessageEvent = MessageEvent.getDefaultInstance()

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

    override suspend fun writeTo(t: MessageEvent, output: OutputStream) {
        t.writeTo(output)
    }
}

val Context.messageDataStore: DataStore
     
     
       by dataStore(
    fileName = "message.pb",
    serializer = MessageEventSerializer
)
     
     
    
    

存数据

ProtocolDatastore提供了一个updateData方法,用于以事务的方式更新存储的对象。它提供数据的当前状态,作为数据类型的一个实例,并在原子读-写-修改操作中以事务方式更新数据。

lifecycleScope.launch {
    context.messageDataStore.updateData {
        it.toBuilder().setMessage("message_proto").build()
    }
}

读数据

使用datastore.data显示所存储对象中相应属性的Flow:

GlobalScope.launch {
    context.messageDataStore.data.collect {
        it.message
        Log.i(TAG, "message="+it.message)
    }
    context.messageDataStore.data.first().message
}

总结

按官方数据来说,DataStore相比SharedPreference更强大,包括在UI线程调用安全,有错误信号通知,运行时异常安全,通过事务确保一致性,类型安全等。

目录
相关文章
|
XML 存储 JSON
Android Jetpack组件 DataStore的使用和简单封装
Android Jetpack组件 DataStore的使用和简单封装
803 0
Android Jetpack组件 DataStore的使用和简单封装
|
存储 XML 安全
Jetpack DataStore 你总要了解一下吧?
一、DataStore 介绍 DataStore 是 Android Jetpack 中的一个组件,它是一个数据存储的解决方案,跟 SharedPreferences 一样,采用key-value形式存储。 DataStore 保证原子性,一致性,隔离性,持久性。尤其是,它解决了 SharedPreferences API 的设计缺陷。 Jetpack DataStore 是经过改进的新版数据存储解决方案,旨在取代 SharedPreferences,让应用能够以异步、事务方式存储数据。
1001 0
Jetpack DataStore 你总要了解一下吧?
|
存储 XML 安全
Android Jetpack系列之DataStore
`Jetpack DataStore` 是一种改进的新数据存储解决方案,允许使用**协议缓冲区**存储键值对或类型化对象。`DataStore` **以异步、一致的事务方式存储数据,克服了 SharedPreferences(以下统称为SP)的一些缺点**。`DataStore`基于`Kotlin`协程和`Flow`实现,并且可以对`SP`数据进行迁移,旨在取代`SP`
549 0
|
存储 安全
Jetpack之DataStore解析
前言在正式讲解DataStore之前,我们先回顾下大家熟知的SharedPreferences(以下简称SP),众所周知SP有一些缺点,如调用getXXX()获取数据,可能会阻塞主线程;无法保证类型安全;加载的数据会一直留在内存中,浪费内存;apply方法无法获取到操作成功或失败的结果。SharedPreferences回顾getXXX()可能会阻塞主线程请看以下SP获取value值的使用代码: 
294 0
Jetpack之DataStore解析
DHL
|
存储 缓存 安全
[Google] 再见 SharedPreferences 拥抱 Jetpack DataStore
Google 新增加了一个新 Jetpack 的成员 DataStore,主要用来替换 SharedPreferences, DataStore 应该是开发者期待已久的库,DataStore 是基于 Flow 实现的,一种新的数据存储方案,它提供了两种实现方式
DHL
327 0
[Google] 再见 SharedPreferences 拥抱 Jetpack DataStore
|
6月前
|
存储 安全 Android开发
构建高效的Android应用:Kotlin与Jetpack的结合
【5月更文挑战第31天】 在移动开发的世界中,Android 平台因其开放性和广泛的用户基础而备受开发者青睐。随着技术的进步和用户需求的不断升级,开发一个高效、流畅且易于维护的 Android 应用变得愈发重要。本文将探讨如何通过结合现代编程语言 Kotlin 和 Android Jetpack 组件来提升 Android 应用的性能和可维护性。我们将深入分析 Kotlin 语言的优势,探索 Jetpack 组件的核心功能,并通过实例演示如何在实际项目中应用这些技术。
|
5月前
|
数据管理 API 数据库
探索Android Jetpack:现代安卓开发的利器
Android Jetpack是谷歌为简化和优化安卓应用开发而推出的一套高级组件库。本文深入探讨了Jetpack的主要构成及其在应用开发中的实际运用,展示了如何通过使用这些工具来提升开发效率和应用性能。
|
4月前
|
存储 数据库 Android开发
🔥Android Jetpack全解析!拥抱Google官方库,让你的开发之旅更加顺畅无阻!🚀
【7月更文挑战第28天】在Android开发中追求高效稳定的路径?Android Jetpack作为Google官方库集合,是你的理想选择。它包含多个独立又协同工作的库,覆盖UI到安全性等多个领域,旨在减少样板代码,提高开发效率与应用质量。Jetpack核心组件如LiveData、ViewModel、Room等简化了数据绑定、状态保存及数据库操作。引入Jetpack只需在`build.gradle`中添加依赖。例如,使用Room进行数据库操作变得异常简单,从定义实体到实现CRUD操作,一切尽在掌握之中。拥抱Jetpack,提升开发效率,构建高质量应用!
70 4
|
5月前
|
Android开发
Jetpack Compose: Hello Android
Jetpack Compose: Hello Android
|
6月前
|
Java 数据库 Android开发
构建高效Android应用:Kotlin与Jetpack的完美结合
【5月更文挑战第28天】 在现代移动开发领域,Android平台以其广泛的用户基础和开放性受到开发者青睐。随着技术的不断进步,Kotlin语言以其简洁性和功能性成为Android开发的首选。而Android Jetpack组件则为开发者提供了一套高质量的设计架构、工具和UI组件,以简化应用程序的开发过程。本文将探讨如何利用Kotlin语言和Android Jetpack组件共同构建一个高效的Android应用程序,涵盖从语言特性到架构模式的全面分析,并提供具体的实践指导。