您的小妾DataStore已经驾到,SharePreference离你而去

简介: 您的小妾DataStore已经驾到,SharePreference离你而去

DataStore 介绍


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

DataStore 是用来替代 SharePreference 的,如果你的项目使用的是 SharePreference,那么建议你迁移到 DataStore

DataStore 提供两种实现 PreferenceDataStore 和 Proto DataStore


PreferenceDataStore

使用键值对的方式存储数据,不能确保类型安全


Proto DataStore

将数据作为自定义类型进行存储,可以确保类型安全


DataStore 使用


PreferenceDataStore

依赖

implementation("androidx.datastore:datastore:1.0.0-beta01")
复制代码


代码

  1. 初始化 DataStore

首先我们在 App 中初始化 dataStore,

class App: Application() {
    companion object{
        val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "settings")
    }
}
复制代码

val Context.dataStore 这句代码调用后我们就可以再全局使用 dataStore 对象了


  1. 初始化 key
val EXAMPLE_COUNTER = intPreferencesKey("example_counter")
复制代码


  1. PreferenceDataStore 存储数据
dataStore.edit { settings ->
            val currentCounterValue = settings[EXAMPLE_COUNTER] ?: 0
            settings[EXAMPLE_COUNTER] = currentCounterValue + 1
        }
复制代码

存储数据的代码每次存储一次数据,EXAMPLE_COUNTER 对应的数据就会加一


  1. PreferenceDataStore 获取数据
val exampleCounterFlow: Flow<Int> = dataStore.data
                .map { preferences ->
                    logEE(preferences[EXAMPLE_COUNTER].toString())//打印数据
                    preferences[EXAMPLE_COUNTER] ?: 0
                }
复制代码


ProtoDataStore

Proto DataStore 实现使用 DataStore 和协议缓冲区将类型化的对象保留在磁盘上。

所谓的协议缓冲区,其实就是指的流

官网对 ProtoDataStore 的集成流程写的不全,所以我找到了这篇文章进行学习:

文章入口


配置集成

  1. 集成依赖
implementation("androidx.datastore:datastore-preferences:1.0.0-beta01")
 implementation "com.google.protobuf:protobuf-javalite:3.10.0"
复制代码


  1. 添加 protobuf protobuf 与 android 和 dependencies 同级
protobuf {
    // 设置 protoc 的版本
    protoc {
        // //从仓库下载 protoc 这里的版本号需要与依赖 com.google.protobuf:protobuf-javalite:xxx 版本相同
        artifact = 'com.google.protobuf:protoc:3.10.0'
    }
    generateProtoTasks {
        all().each { task ->
            task.builtins {
                java {
                    option "lite"
                }
            }
        }
    }
    // 默认生成目录 $buildDir/generated/source/proto 通过 generatedFilesBaseDir 改变生成位置
    generatedFilesBaseDir = "$projectDir/src/main"
}
复制代码


  1. 添加源码目录
sourceSets {
        main {
            proto {
                // proto 文件默认路径是 src/main/proto
                // 可以通过 srcDir 修改 proto 文件的位置
                srcDir 'src/main/proto'
            }
        }
    }
复制代码


  1. 添加 gradle 插件
id "com.google.protobuf" version "0.8.12"
复制代码

配置集成完成


代码集成

  1. 编写 proto 文件并编译

image.png


  1. 编写 proto 文件
syntax = "proto3";
option java_package = "com.ananananzhuo.datastoredemo";//必须是自己的包名
option java_multiple_files = true;
message Settings {
  int32 example_counter = 1;
}
复制代码


  1. 编写 java 文件 SettingsSerializer 这个文件在编译后会被移动到 src/main/debug/java/com.ananananzhuo.datastoredemo 目录下
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)
}
val Context.settingsDataStore: DataStore<Settings> by dataStore(
    fileName = "settings.pb",
    serializer = SettingsSerializer
)
复制代码


  1. 存储数据 存储数据一定要在协程中调用
suspend fun incrementCounter() {
        settingsDataStore.updateData { currentSettings ->
            currentSettings.toBuilder()
                .setExampleCounter(currentSettings.exampleCounter + 1)
                .build()
        }
    }
复制代码


  1. 获取数据
val exampleCounterFlow: Flow<Int> = settingsDataStore.data
                .map { settings ->
                    logEE(settings.exampleCounter.toString())//获取数据并打印
                    settings.exampleCounter
                }
复制代码

项目git地址:

github.com/ananananzhu…



相关文章
|
XML 存储 JSON
Android Jetpack组件 DataStore的使用和简单封装
Android Jetpack组件 DataStore的使用和简单封装
1356 0
Android Jetpack组件 DataStore的使用和简单封装
|
缓存 API Android开发
Android Kotlin之Flow数据流
`Flow`是`google`官方提供的一套基于`kotlin`协程的响应式编程模型,它与`RxJava`的使用类似,但相比之下`Flow`使用起来更简单,另外`Flow`作用在协程内,可以与协程的生命周期绑定,当协程取消时,`Flow`也会被取消,避免了内存泄漏风险。
1383 1
|
XML Android开发 数据格式
Android深度定制化TabLayout:圆角,渐变色,背景边框,圆角渐变下划线,基于Android原生TabLayout
Android深度定制化TabLayout:圆角,渐变色,背景边框,圆角渐变下划线,基于Android原生TabLayout 在附录1的基础上丰富自定义的TabLayout,这次增加两个内容:1, 当选中某一个切换卡时候,文本字体变粗。
6526 0
|
6月前
|
JSON API 数据格式
手把手教你抓取京东商品评论:API 接口解析与 Python 实战
京东商品评论蕴含用户对产品质量、体验和服务的真实反馈,分析这些数据有助于企业优化产品和满足用户需求。由于京东未提供官方API,需通过逆向工程获取评论数据。其主要接口为“商品评论列表接口”,支持按商品ID、评分、排序方式等参数获取评论,返回JSON格式数据,包含评论列表、摘要(如好评率)及热门标签等信息。
|
6月前
|
人工智能 自然语言处理 API
推荐几个常用免费的文本转语音工具
本文推荐了几款免费的文本转语音工具,包括功能全面的AI易视频、支持多语言的Google TTS、操作便捷的Natural Reader、离线使用的Balabolka以及轻量级的Speech2Go。其中AI易视频特别适合小说转语音,可智能分配角色音色,打造广播剧般的听觉体验。这些工具各具特色,能满足不同场景需求,助力内容创作更高效。
1297 5
|
Java Unix Linux
Android Studio中Terminal运行./gradlew clean build提示错误信息
遇到 `./gradlew clean build`命令执行出错时,首先应检查错误信息的具体内容,这通常会指向问题的根源。从权限、环境配置、依赖下载、版本兼容性到项目配置本身,逐一排查并应用相应的解决措施。记住,保持耐心,逐步解决问题,往往复杂问题都是由简单原因引起的。
1121 2
|
Web App开发 网络协议 算法
WebRTC 和一些常见的直播方案
【10月更文挑战第25天】
|
存储 Dart 前端开发
为什么说 Compose 的声明式代码最简洁 ?Compose/React/Flutter/SwiftUI 语法对比
为什么说 Compose 的声明式代码最简洁 ?Compose/React/Flutter/SwiftUI 语法对比
502 1
|
Android开发 UED
Android采用Scroller实现底部二楼效果
Android采用Scroller实现底部二楼效果
190 0
Android采用Scroller实现底部二楼效果
|
监控 安全 应用服务中间件
HTTPS代理搭建技巧分享​
请注意,HTTPS代理的配置和管理需要谨慎,特别是涉及SSL证书的处理。确保您的代理服务器按照最佳实践进行配置和管理,以提供安全可靠的代理服务。
761 3