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 {@Volatileprivate var INSTANCE: SpfUtils? = null@JvmStaticfun 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)// 写入 SPFsetSpfSaveName("你好,SPF")println("SPF 打印:${getSpfSaveName()}")// 迁移到 DataStoreCoroutineScope(Dispatchers.IO).launch {// 读取println("dataStore 打印:${readSaveName()}")// 写入 datastorewriteSaveName("你好,dataStore")// 再次读取println("dataStore 打印:${readSaveName()}")}}
}
  • 结果:
I/System.out: SPF 打印:你好,SPF
I/System.out: dataStore 打印:你好,SPF
I/System.out: dataStore 打印:你好,dataStore

完事

Android jetpack DataStore 1.0.0-rc02最新版从SharedPreferences迁移到Preferences DataStore相关推荐

  1. 【Android Jetpack】DataStore

    目录 1. 前言 2. 分类 2.1 Preferences DataStore 和SharedPreferences的区别 3. 实践 3.1 Preferences DataStore 3.1.1 ...

  2. Android Jetpack组件DataStore之Proto与Preferences存储详解与使用

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

  3. Android Studio 配置OpenCV4.4.0 不用安装OpenCV Manager (泪崩居然用了礼拜天2天的时间居然还没配置成功,今天又看了下配置成功了)

    Android Studio 配置OpenCV4.4.0 ,说来惭愧居然用户礼拜天2天的时间呢,期间遇到的问题大致有4个问题 这里我也总结出了最后在列举出来,(可能是新版和之前旧版本不一样的问题按照网 ...

  4. ERROR: Failed to resolve: com.android.support:appcompat-v7:29.0.0

    错误内容如下 ERROR: Failed to resolve: com.android.support:appcompat-v7:29.0.0 Show in Project Structure d ...

  5. No cached version of com.android.tools.build:gradle:2.0.0 available for offline mode.

    异常场景 从AS2.0升级到2.1,重新编译工程后,抛出了如下异常 Error:A problem occurred configuring root project 'AndroidStudioPr ...

  6. Eclipse中通过Android模拟器调用OpenGL ES2.0函数操作步骤

    1.  先按照http://blog.csdn.net/fengbingchun/article/details/10439281中操作搭建好基本的Android开发环境: 2.  打开Eclipse ...

  7. 解决编译不通过Could not find support-compat.aar (com.android.support:support-compat:26.0.0).

    android 编译报错: > Could not find support-compat.aar (com.android.support:support-compat:26.0.0).Sea ...

  8. Android 异常: failed to connect to localhost/127.0.0.1

    Android 异常: failed to connect to localhost/127.0.0.1 参考文章: (1)Android 异常: failed to connect to local ...

  9. 问题解决-Failed to resolve: com.android.support.constraint:constraint-layout:1.0.0-alpha7

    问题解决-Failed to resolve: com.android.support.constraint:constraint-layout:1.0.0-alpha7 参考文章: (1)问题解决- ...

  10. 针对Android Tv的自定义RecyclerView2 0横竖向连动

    版权声明:本文为博主原创文章,转载请注明出处. 推荐: 欢迎关注我创建的Android TV 简书专题,会定期给大家分享一些AndroidTv相关的内容: www.jianshu.com/c/37ef ...

最新文章

  1. boost::hana::detail::type_foldr1用法的测试程序
  2. 执行存储过程出现:不是有效的标识符。
  3. 浅谈:Android应用清理内存
  4. c 多文件全局变量_C语言开发单片机为什么大多数都采用全局变量的形式?
  5. spring创建定时任务
  6. GoLang笔记—容器篇
  7. DirectX11 SDK 例程报错解决方法
  8. 快来带您了解中秋节的前世今生
  9. (二)JAVA设计模式中的六大设计原则之里氏替换原则
  10. 使用Python,OpenCV沿着轮廓寻找极值点
  11. Python re模块 —— 从零基础开始入门正则表达式
  12. 城市代码(weather.com)[转]
  13. 学术英语/专业英语——基本结构及特点
  14. linux删除 0 字节文件,如何恢复 Linux 上删除的文件
  15. 网站设计全攻略-3、确定网站的栏目和版块
  16. [世界杯] 澳大利亚 vs 日本 3:1
  17. 阿里巴巴、文投控股战略投资万达电影
  18. 第二届全国技能大赛(世赛项目)福建省选拔赛 网络安全项目任务书
  19. mre应用和Native的交互之增加mre sdk接口
  20. 小甲鱼第1-4章(未整理)

热门文章

  1. P4173 残缺的字符串(带通配符的字符串匹配,FFT)
  2. 微信小程序分享至朋友圈
  3. 如何在Mac设置开机自启程序项,教程在这!
  4. c语言中compar的用法,C/C++中关于std::string的compare陷阱示例详解
  5. 解决word标题样式错乱
  6. 跳跃表(Skip list)原理
  7. 十二进制转二进制--2018
  8. 使用mbw测试内存带宽性能
  9. 函数的单调性与极值点
  10. web项目防御mysql注入_WEB安全 php+mysql5注入防御(二)