IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android jetpack DataStore 1.0.0-rc02最新版从SharedPreferences迁移到Preferences DataStore -> 正文阅读

[移动开发]Android jetpack DataStore 1.0.0-rc02最新版从SharedPreferences迁移到Preferences DataStore

Android jetpack DataStore 1.0.0-rc02最新版从SharedPreferences迁移到Preferences DataStore

前言

一直听说新的持久化存储库DataStore完爆Android一直在使用的SharedPreferences,但是由于工作忙碌,加上DataStore一直没有从alpha版本跳出,所以没有认真去了解和学习DataStore,现在刚好有空余时间,就开始深入学习一下。

对我而言,DataStore的新特性几乎就是kotlin体系带来的优势,对于已经用了一年kotlin的开发者来说,创建DataStore以及读写数据,几乎手到擒来,看一下就明白了,但是一参考官方的Codelab,写一个DEMO,我就懵了,官方的开发者指南还是按照alpha6版的API来写的,最新的rc02的版本却完全没有context.createDataStore()这个API。行吧alpha就是个alpha。

进过一番查询,终于在官方的说明文档中找到了,新的使用方法:
DataStore

// At the top level of your kotlin file:
val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "settings")

好家伙,看起来简洁了些,但是如何从SharedPreferences迁移到Preferences DataStore呢?
行吧,整个百度都没搜出来…

迁移

public fun preferencesDataStore(
    name: String,
    corruptionHandler: ReplaceFileCorruptionHandler<Preferences>? = null,
    produceMigrations: (Context) -> List<DataMigration<Preferences>> = { listOf() },
    scope: CoroutineScope = CoroutineScope(Dispatchers.IO + SupervisorJob())
): ReadOnlyProperty<Context, DataStore<Preferences>> {
    return PreferenceDataStoreSingletonDelegate(name, corruptionHandler, produceMigrations, scope)
}

在preferencesDataStore方法中有一个参数是produceMigrations,这个看起来就是迁移的方法了,需要返回一个List,不难看出,和alpha6版的参数migrations如出一辙,直接抄过来即可

val Context.dataStore: DataStore<Preferences> by preferencesDataStore("new_datastore", produceMigrations = { con ->
    listOf(SharedPreferencesMigration(con, "old_spf"))
})

测试

为了验证我的思路,写一个demo进行验证;

  • 首先,先把旧的SharedPreferences存储类给出:
/**
 * 轻量键值参数存储
 *
 * @author D10NG
 * @date on 2019-11-07 15:26
 */
class SpfUtils constructor(context: Context, spName: String) {

    private val mSpf = context.getSharedPreferences(spName, Context.MODE_PRIVATE)

    companion object {

        @Volatile
        private var INSTANCE: SpfUtils? = null

        @JvmStatic
        fun instant(context: Context, spName: String) : SpfUtils =
            INSTANCE ?: synchronized(this) {
                INSTANCE ?: SpfUtils(context, spName).also {
                    INSTANCE = it
                }
            }
    }

    fun getSpf() : SharedPreferences {
        return mSpf
    }
}
  • 实际存储操作:
/** 默认表单 */
const val SP_CONFIG = "old_spf"

/**
 * 获取本地存储器工具
 * @receiver Context
 * @param spName String
 * @return SharedPreferences
 */
fun Context.getSpf(spName: String = SP_CONFIG) = SpfUtils.instant(this, spName).getSpf()

/** 测试字符串 */
const val SPF_SAVE_NAME = "save_name"

fun Context.getSpfSaveName(): String =
    getSpf().getString(SPF_SAVE_NAME, null)?: ""

fun Context.setSpfSaveName(value: String) {
    getSpf().edit().putString(SPF_SAVE_NAME, value).apply()
}
  • 新的存储方式:
val Context.dataStore: DataStore<Preferences> by preferencesDataStore("new_datastore", produceMigrations = { con ->
    listOf(SharedPreferencesMigration(con, SP_CONFIG))
})

suspend fun Context.readSaveName(): String {
    return dataStore.data.map {
        it[stringPreferencesKey(SPF_SAVE_NAME)]?: "NULL"
    }.first()
}

suspend fun Context.writeSaveName(value: String) {
    dataStore.edit {
        it[stringPreferencesKey(SPF_SAVE_NAME)] = value
    }
}
  • 最终验证代码
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)


        // 写入 SPF
        setSpfSaveName("你好,SPF")
        println("SPF 打印:${getSpfSaveName()}")
        // 迁移到 DataStore
        CoroutineScope(Dispatchers.IO).launch {
            // 读取
            println("dataStore 打印:${readSaveName()}")
            // 写入 datastore
            writeSaveName("你好,dataStore")
            // 再次读取
            println("dataStore 打印:${readSaveName()}")
        }
    }
}
  • 结果:
I/System.out: SPF 打印:你好,SPF
I/System.out: dataStore 打印:你好,SPF
I/System.out: dataStore 打印:你好,dataStore

完事

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-13 12:13:24  更:2021-08-13 12:15:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 22:49:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码