• 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

    在这里插入图片描述

  • 相关阅读:
    I2C相关实验2
    AI实用技巧 | 5分钟将coze集成到微信群机器人
    展技术实力,筑元宇宙安全,零时科技成为首批湾区元宇宙联盟成员
    javascript的AMD模式
    循环购:一种具有裂变能力的商业模式
    【Apollo学习笔记】——规划模块TASK之PIECEWISE_JERK_NONLINEAR_SPEED_OPTIMIZER(二)
    使用jspdf插件将网页中的内容导出为高保真的pdf文件
    YOLOv7改进:CBAM注意力机制
    瑞吉外卖项目实战Day9-前后端分离,项目部署
    程序设计2018
  • 原文地址:https://blog.csdn.net/m0_46278918/article/details/125517664