}

然后我们在AndroidManifest中设置

下面我们新建一个EasyDataStore类,将它设置为object,先创建DataStore,代码如下:

// 创建DataStore

val App.dataStore: DataStore by preferencesDataStore(

name = “Study”

)

// DataStore变量

val dataStore = App.instance.dataStore

下面我们先写好各个数据类型的存取方法,先写存数据的方法:

/**

存放Int数据

*/

private suspend fun putIntData(key: String, value: Int) = dataStore.edit {

it[intPreferencesKey(key)] = value

}

/**

存放Long数据

*/

private suspend fun putLongData(key: String, value: Long) = dataStore.edit {

it[longPreferencesKey(key)] = value

}

/**

存放String数据

*/

private suspend fun putStringData(key: String, value: String) = dataStore.edit {

it[stringPreferencesKey(key)] = value

}

/**

存放Boolean数据

*/

private suspend fun putBooleanData(key: String, value: Boolean) = dataStore.edit {

it[booleanPreferencesKey(key)] = value

}

/**

存放Float数据

*/

private suspend fun putFloatData(key: String, value: Float) = dataStore.edit {

it[floatPreferencesKey(key)] = value

}

/**

存放Double数据

*/

private suspend fun putDoubleData(key: String, value: Double) = dataStore.edit {

it[doublePreferencesKey(key)] = value

}

然后是取数据的方法:

/**

取出Int数据

*/

private fun getIntData(key: String, default: Int = 0): Int = runBlocking {

return@runBlocking dataStore.data.map {

it[intPreferencesKey(key)] ?: default

}.first()

}

/**

取出Long数据

*/

private fun getLongData(key: String, default: Long = 0): Long = runBlocking {

return@runBlocking dataStore.data.map {

it[longPreferencesKey(key)] ?: default

}.first()

}

/**

取出String数据

*/

private fun getStringData(key: String, default: String? = null): String = runBlocking {

return@runBlocking dataStore.data.map {

it[stringPreferencesKey(key)] ?: default

}.first()!!

}

/**

取出Boolean数据

*/

private fun getBooleanData(key: String, default: Boolean = false): Boolean = runBlocking {

return@runBlocking dataStore.data.map {

it[booleanPreferencesKey(key)] ?: default

}.first()

}

/**

取出Float数据

*/

private fun getFloatData(key: String, default: Float = 0.0f): Float = runBlocking {

return@runBlocking dataStore.data.map {

it[floatPreferencesKey(key)] ?: default

}.first()

}

/**

取出Double数据

*/

private fun getDoubleData(key: String, default: Double = 0.00): Double = runBlocking {

return@runBlocking dataStore.data.map {

it[doublePreferencesKey(key)] ?: default

}.first()

}

最后我们根据存取的数据类型去做一个封装,存数据,代码如下:

/**

存数据

*/

fun putData(key: String, value: T) {

runBlocking {

when (value) {

is Int -> putIntData(key, value)

is Long -> putLongData(key, value)

is String -> putStringData(key, value)

is Boolean -> putBooleanData(key, value)

is Float -> putFloatData(key, value)

is Double -> putDoubleData(key, value)

else -> throw IllegalArgumentException(“This type cannot be saved to the Data Store”)

}

}

}

取数据:

/**

取数据

*/

fun getData(key: String, defaultValue: T): T {

val data = when (defaultValue) {

is Int -> getIntData(key, defaultValue)

is Long -> getLongData(key, defaultValue)

is String -> getStringData(key, defaultValue)

is Boolean -> getBooleanData(key, defaultValue)

is Float -> getFloatData(key, defaultValue)

is Double -> getDoubleData(key, defaultValue)

else -> throw IllegalArgumentException(“This type cannot be saved to the Data Store”)

}

return data as T

}

对了,还有一个清除数据的方法:

/**

清空数据

*/

fun clearData() = runBlocking { dataStore.edit { it.clear() } }

这样我们的DataStore就封装好了,下面我们在MainActivity中使用一下:

这里我们存数据、取数据、清空数据都用到了,下面运行一下:

对于DataStore最基本的操作就完成了,那么下面来进阶一下。

五、对象存取

其实我们刚才使用的是Preferences DataStore,是对数据进行操作,下面要操作的是Proto DataStore,官网上的说法是Proto DataStore 将数据作为自定义数据类型的实例进行存储。此实现要求您使用协议缓冲区来定义架构,但可以确保类型安全。

Proto DataStore中采用的是ProtorBuffer,优势是性能好、效率高,表现在对数据的序列化和反序列化时间快,占用的空间小,还记得之前我们看到的那个pb文件吗,它里面采用的就是protobuf,之前一直是Google内部使用,这也是源于它的缺点,之前这个pb文件我们打开过,里面只能看懂键和值,缺乏描述,因此就影响了可读性,和广泛性,不如Json和XML简单。因此我们目前也只是在DataStore中使用protobuf,下面为了使用,我们需要在项目中装一个插件。

1. 插件安装

这个插件的安装比较的麻烦,首先是添加协议缓冲区插件

① 添加协议缓冲区插件

首先打开工程的build.gradle,在里面添加如下代码:

id “com.google.protobuf” version “0.8.12” apply false

再打开app下的build.gradle,添加如下代码:

id ‘com.google.protobuf’

② 添加协议缓冲区和 Proto DataStore 依赖项

在app的dependencies{}闭包中添加如下代码:

//Proto DataStore

implementation ‘androidx.datastore:datastore-core:1.0.0’

implementation ‘com.google.protobuf:protobuf-javalite:3.10.0’

③ 配置协议缓冲区

在app的build.gradle中添加如下代码:

protobuf {

protoc {

artifact = “com.google.protobuf:protoc:3.10.0”

}

// 为该项目中的 Protobufs 生成 java Protobuf-lite 代码。

generateProtoTasks {

all().each { task ->

task.builtins {

java {

option ‘lite’

}

}

}

}

}

注意它添加的位置:

点击Sync Now。

2. 创建proto文件

将项目切换到Project,然后在main下面新建一个proto文件夹。

在此文件夹下新建study.proto文件,然后AS会发现打开这个格式需要安装一个插件。

点击Install plugins进行安装。

安装成功之后,重启AS插件生效。

注意看这个文件的图标变了,这说明你的插件安装成功并且配置成功了。

3. 配置proto文件

里面的代码如下:

// 声明协议, 也支持 prota2,普遍使用proto3

syntax = “proto3”;

/**

通过potorbuf 描述对象生成java类。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)

最后

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

当然我也为你们整理好了百度、阿里、腾讯、字节跳动等等互联网超级大厂的历年面试真题集锦。这也是我这些年来养成的习惯,一定要学会把好的东西,归纳整理,然后系统的消化吸收,这样才能极大的提高学习效率和成长进阶。碎片、零散化的东西,我觉得最没有价值的。就好比你给我一张扑克牌,我只会觉得它是一张废纸,但如果你给我一副扑克牌,它便有了它的价值。这和我们收集资料就要收集那些系统化的,是一个道理。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长! 4270467)]

最后

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

当然我也为你们整理好了百度、阿里、腾讯、字节跳动等等互联网超级大厂的历年面试真题集锦。这也是我这些年来养成的习惯,一定要学会把好的东西,归纳整理,然后系统的消化吸收,这样才能极大的提高学习效率和成长进阶。碎片、零散化的东西,我觉得最没有价值的。就好比你给我一张扑克牌,我只会觉得它是一张废纸,但如果你给我一副扑克牌,它便有了它的价值。这和我们收集资料就要收集那些系统化的,是一个道理。

[外链图片转存中…(img-vJngT9Zy-1712684270467)]

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长! [外链图片转存中…(img-1Qx4xLey-1712684270467)]

好文阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: