• Preferences DataStore全解析


    前言

    DataStore 是用来取代 SharedPreferences 的一种简易数据存储的解决方案。

    既然是方案,也就是说 DataStore 并不是具体的代码实现,目前其具体实现有两种方式:

    • Preferences DataStore
    • Proto DataStore

    下面我们来看看如何使用 Preferences DataStore

    创建

    首先我们得添加下依赖:

    implementation "androidx.datastore:datastore-preferences:1.0.0"
    
    • 1

    然后创建 DataStore:

    val Context.dataStore: DataStore by preferencesDataStore(name = "number")
    
    • 1

    存储数据

    在以往我们使用 SharedPreferences 的时候,我们都是使用 的形式进行填写的,但是 DataStore 与 SharedPreferences 不同的是,DataStore 并不是以 String 作为 key,而是以 Preferences.Key 作为 Key,不同的数据类型需要不同写法:

    • Int -> intPreferencesKey(name)
    • Double -> doublePreferencesKey(name)
    • String -> stringPreferencesKey(name)
    • Boolean -> booleanPreferencesKey(name)
    • Float -> floatPreferencesKey(name)
    • Long -> longPreferencesKey(name)
    • Set -> stringSetPreferencesKey(name)

    这里我以存储 int 类型作为示例:

    	    val EXAMPLE_COUNTER = intPreferencesKey("example_counter")   // 创建 key
    
            dataStore.edit { settings ->
                val currentCounterValue = settings[EXAMPLE_COUNTER] ?: 0
                settings[EXAMPLE_COUNTER] = currentCounterValue + 1
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    大概意思其实就是把值读取出来,然后 +1 在放回去。

    读取数据

    val EXAMPLE_COUNTER = intPreferencesKey("example_counter")  // 创建 key
    
    val exampleCounterFlow: Flow = dataStore.data
      .map { preferences ->
        preferences[EXAMPLE_COUNTER] ?: 0
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    要注意,exampleCounterFlow 是一个 Flow,是一个冷流,map 只是一个数据转换,所以,想要真正获取数据还需要调用 collect:

            dataStore.data
                .map { preferences ->
                    preferences[EXAMPLE_COUNTER] ?: 0
                }.collect {
                    println("EXAMPLE_COUNTER 的值:$it")
                }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    清除全部数据

            dataStore.edit {
                it.clear()
            }
    
    • 1
    • 2
    • 3

    SharedPreferences 兼容

    Preferences DataStore 还提供一种方式,将 SharedPreferences 里面的数据迁移到 Preferences DataStore 中。

    首先,我们先来回顾下 SharedPreferences

    写入数据:

            getSharedPreferences("old_data", MODE_PRIVATE).edit().apply {
                putString("name", "不近视的猫")
                apply()
            }
    
    • 1
    • 2
    • 3
    • 4

    文件生成:
    在这里插入图片描述

    文件内容:

    
    
        不近视的猫
    
    
    • 1
    • 2
    • 3
    • 4

    下面就是通过 SharedPreferencesMigration 进行 SharedPreferences 的迁移了:

    val Context.dataStore: DataStore by preferencesDataStore(name = "new_data",
        produceMigrations = { context ->
            listOf(SharedPreferencesMigration(context, "old_data"))
        })
    
    • 1
    • 2
    • 3
    • 4

    当然,直接这样声明是不会进行运行的,需要稍微使用到 dataStore:

            GlobalScope.launch {
                dataStore.edit {  }
            }
    
    • 1
    • 2
    • 3

    然后我们就能看到 old_data.xml 文件被删除了,而被取代的是 /data/data/com.bjsdm.testkotlin/files/datastore/new_data.preferences_pb

    在这里插入图片描述

  • 相关阅读:
    ArrayList 源码解析(JDK1.8)
    VTK 基础入门 ( 一 ) 基本实例超详解释
    理解参数传递
    基于python的语音识别与蓝牙通信的温控系统毕设项目
    杰理之编码请求参数解析【篇】
    C++入门【下】—— 预处理与内联函数关系
    【Unity3D】Shader Graph节点
    前置语音群呼与语音机器人群呼哪个更好
    如何理解MIPS = 指令条数/(执行时间x10^6)=主频/(CPIx10^6)
    DockerCompose - 部署 Nexus 私服
  • 原文地址:https://blog.csdn.net/m0_46278918/article/details/125517664