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 {@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相关推荐
- 【Android Jetpack】DataStore
目录 1. 前言 2. 分类 2.1 Preferences DataStore 和SharedPreferences的区别 3. 实践 3.1 Preferences DataStore 3.1.1 ...
- Android Jetpack组件DataStore之Proto与Preferences存储详解与使用
一.介绍 Jetpack DataStore 是一种数据存储解决方案,允许您使用协议缓冲区存储键值对或类型化对象.DataStore 使用 Kotlin 协程和 Flow 以异步.一致的事务方式存储数 ...
- Android Studio 配置OpenCV4.4.0 不用安装OpenCV Manager (泪崩居然用了礼拜天2天的时间居然还没配置成功,今天又看了下配置成功了)
Android Studio 配置OpenCV4.4.0 ,说来惭愧居然用户礼拜天2天的时间呢,期间遇到的问题大致有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 ...
- 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 ...
- Eclipse中通过Android模拟器调用OpenGL ES2.0函数操作步骤
1. 先按照http://blog.csdn.net/fengbingchun/article/details/10439281中操作搭建好基本的Android开发环境: 2. 打开Eclipse ...
- 解决编译不通过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 ...
- 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 ...
- 问题解决-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)问题解决- ...
- 针对Android Tv的自定义RecyclerView2 0横竖向连动
版权声明:本文为博主原创文章,转载请注明出处. 推荐: 欢迎关注我创建的Android TV 简书专题,会定期给大家分享一些AndroidTv相关的内容: www.jianshu.com/c/37ef ...
最新文章
- boost::hana::detail::type_foldr1用法的测试程序
- 执行存储过程出现:不是有效的标识符。
- 浅谈:Android应用清理内存
- c 多文件全局变量_C语言开发单片机为什么大多数都采用全局变量的形式?
- spring创建定时任务
- GoLang笔记—容器篇
- DirectX11 SDK 例程报错解决方法
- 快来带您了解中秋节的前世今生
- (二)JAVA设计模式中的六大设计原则之里氏替换原则
- 使用Python,OpenCV沿着轮廓寻找极值点
- Python re模块 —— 从零基础开始入门正则表达式
- 城市代码(weather.com)[转]
- 学术英语/专业英语——基本结构及特点
- linux删除 0 字节文件,如何恢复 Linux 上删除的文件
- 网站设计全攻略-3、确定网站的栏目和版块
- [世界杯] 澳大利亚 vs 日本 3:1
- 阿里巴巴、文投控股战略投资万达电影
- 第二届全国技能大赛(世赛项目)福建省选拔赛 网络安全项目任务书
- mre应用和Native的交互之增加mre sdk接口
- 小甲鱼第1-4章(未整理)