当前位置: 首页 > news >正文

dedecms教育h5网站模板wordpress 主题右边栏

dedecms教育h5网站模板,wordpress 主题右边栏,赣州做网站多少钱,柳州网站制作推荐文章目录 Jetpack DataStore概述DataStore 对比 SP添加依赖库Preferences DataStore路径创建 Preferences DataStore获取数据保存数据修改数据删除数据清除全部数据 Proto DataStore配置AndroidStudio安装插件配置proto文件创建序列化器 创建 Proto DataStore获取数据保存数据修…

文章目录

  • Jetpack DataStore
    • 概述
    • DataStore 对比 SP
    • 添加依赖库
    • Preferences DataStore
      • 路径
      • 创建 Preferences DataStore
      • 获取数据
      • 保存数据
      • 修改数据
      • 删除数据
      • 清除全部数据
    • Proto DataStore
      • 配置
        • AndroidStudio安装插件
        • 配置proto文件
        • 创建序列化器
      • 创建 Proto DataStore
      • 获取数据
      • 保存数据
      • 修改数据
      • 删除Map数据
      • 清除数据
    • 代码下载

Jetpack DataStore

概述

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

DataStore 提供两种不同的实现:Preferences DataStore 和 Proto DataStore。

  • Preferences DataStore 使用键存储和访问数据。此实现不需要预定义的架构,也不确保类型安全。
  • Proto DataStore 将数据作为自定义数据类型的实例进行存储。此实现要求您使用协议缓冲区来定义架构,但可以确保类型安全。

DataStore 官方文档

Proto3 语法入门

Proto3 官方语法指南

DataStore 对比 SP

SharedPreference(简称SP) 是一个轻量级的数据存储方式,使用方便,以键值对的形式存储在本地。

SP的缺点:

  • SP不能保证类型安全。如果存的数据和取的数据的类型不一致时会报异常。
  • SP加载的数据会一直停留在内存中。
  • 不支持多进程。
  • 读写性能差,可能阻塞UI线程,可能引起ANR。

DataStore优点:

  • 读写性能高。基于协程和Flow保证了UI线程的安全性。
  • 从一定程度上保证类型安全。

添加依赖库

project/build.gradle

buildscript {   dependencies {// Proto DataStoreclasspath 'com.google.protobuf:protobuf-gradle-plugin:0.8.19'}
}

module/build.gradle

plugins {id 'com.android.application'id 'kotlin-android'id 'com.google.protobuf'
}dependencies {// Preferences DataStoreimplementation "androidx.datastore:datastore-preferences:1.0.0"implementation "androidx.datastore:datastore-core:1.0.0"// Proto DataStoreimplementation 'androidx.datastore:datastore-core:1.0.0'implementation 'com.google.protobuf:protobuf-javalite:3.10.0'implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.5.0"}protobuf {protoc {artifact = "com.google.protobuf:protoc:3.14.0"}// 为该项目中的 Protobufs 生成 java Protobuf-lite 代码。generateProtoTasks {all().each { task ->task.builtins {java {option 'lite'}}}}
}

Preferences DataStore

路径

DataStore 生成的缓存文件存放在 /data/data/<包名>/files/datastore 目录下:

在这里插入图片描述

创建 Preferences DataStore

val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "user_info")

获取数据

lifecycleScope.launch {dataStore.edit { preferences ->// 先通过 stringPreferencesKey() 方法获取指定Keyval nameKey = stringPreferencesKey("name")val ageKey = intPreferencesKey("age")val sexKey = booleanPreferencesKey("sex")// 通过Key获取值val name = preferences[nameKey]val age = preferences[ageKey]val sex = preferences[sexKey]logE("name:$name age:$age sex:$sex")}
}

保存数据

dataStore.edit { preferences ->preferences[stringPreferencesKey("name")] = "小明"preferences[intPreferencesKey("age")] = 18preferences[booleanPreferencesKey("sex")] = true
}

修改数据

 dataStore.edit { preferences ->preferences[stringPreferencesKey("name")] = "小黑"preferences[intPreferencesKey("age")] = 28preferences[booleanPreferencesKey("sex")] = false}

删除数据

dataStore.edit { preferences ->val removeValue = preferences.remove(stringPreferencesKey("name"))logE("remove:$removeValue")
}

清除全部数据

dataStore.edit { preferences ->preferences.clear()
}

Proto DataStore

配置

AndroidStudio安装插件

在这里插入图片描述

配置proto文件

先新建 proto 目录:

在这里插入图片描述

再创建 person.proto 文件,并写入:

syntax = "proto3";option java_package = "com.example.datastoredemo"; //设置生成的类所在的包
option java_multiple_files = true; //可能会有多个文件。message PersonPreferences {string name = 1; //String类型int32 age = 2; //int类型bool sex = 3; //boolean类型repeated string address = 4; //String[]数组map<string, string> fruits = 5; //Map类型
}
创建序列化器
object PersonSerializer : Serializer<PersonPreferences> {override val defaultValue: PersonPreferencesget() = PersonPreferences.getDefaultInstance()override suspend fun writeTo(t: PersonPreferences, output: OutputStream) {t.writeTo(output)}override suspend fun readFrom(input: InputStream): PersonPreferences {try {return PersonPreferences.parseFrom(input)} catch (exception: InvalidProtocolBufferException) {throw CorruptionException("Cannot read proto.", exception)}}
}

创建 Proto DataStore

val Context.personDataStore: DataStore<PersonPreferences> by dataStore(fileName = "person.pb", serializer = PersonSerializer
)

获取数据

lifecycleScope.launch {personDataStore.data.first().let { preferences ->val name = preferences.nameval age = preferences.ageval sex = preferences.sexval address = preferences.addressListval fruits = preferences.fruitsMaplogE("name:$name age:$age sex:$sex address:$address fruits:$fruits")}
}

保存数据

preferences.toBuilder().setName("小白").setAge(28).setSex(true).addAddress("广东省").addAddress("广州市").addAddress("黄埔区").putFruits("apple", "苹果").putFruits("banner", "香蕉").putFruits("cherry", "樱桃").build()
preferences.toBuilder().setName("小白").setAge(28).setSex(true).addAllAddress(listOf("广东省", "广州市", "黄埔区")).putAllFruits(mapOf("apple" to "苹果", "banner" to "香蕉", "cherry" to "樱桃")).build()

修改数据

personDataStore.updateData { preferences -preferences.toBuilder().setName("小黑").setAge(38).setSex(false).setAddress(0, "湖南省").setAddress(1, "长沙市").setAddress(2, "芙蓉区").putFruits("apple", "苹果1号").build()
}

删除Map数据

 personDataStore.updateData { preferences ->preferences.toBuilder().removeFruits("apple")  // 删除map数据.build()}

清除数据

personDataStore.updateData { preferences ->// 清除所有数据preferences.toBuilder().clear().build()// 依次清除数据preferences.toBuilder().clearName().clearAge().clearSex().clearAddress().clearFruits().build()
}
personDataStore.updateData { preferences ->// 清除所有数据preferences.toBuilder().clear().build()// 依次清除数据preferences.toBuilder().clearName().clearAge().clearSex().clearAddress().clearFruits().build()
}

代码下载

http://www.yayakq.cn/news/344159/

相关文章:

  • 网站系统建设支出分录ih5制作平台官网
  • 网站制作常用代码长春专业网站建设哪家口碑好
  • 资兴市网站建设专业玉环网站建设
  • 最新一键自助建站程序源码外网图片素材网站
  • 静态双语企业网站后台源码山东建设工程信息网站
  • flas网站开发工具东莞网站建设方案咨询
  • 公司网站建设排名wordpress 上传下载
  • 山东聊城网站设计重点学科网站建设
  • 广州市国外网站建设平台怀来网站建设
  • 现在那个网站做推广效果会好点兰州互联网公司的排名
  • 自己做网站上市qq空间网站
  • 青州哪里做网站域名注册网站那个好
  • vs连接数据库做网站网站维护费用怎么收
  • 外包做网站一般多少钱旧房翻新装修多少钱一平方
  • 网站开发过程中遇到的问题及解决办法济宁做网站哪家比较好
  • 网站页面多少长沙做公司网站
  • 哪个网站做脚本网站式登录页面模板下载
  • 南宁网站建站做公司官网怎么做
  • 想开网站怎样做做产品网站多少钱
  • 网红营销成功案例黑帽seo优化软件
  • 图片演示dw做网站嵌入式培训报告
  • 购物网站的开发品牌宣传网站
  • 全球设计网站建设工程网站建筑工程预算
  • 大型网站开发 赚钱旅游最新资讯
  • 徐州市政建设集团公司网站网络学校
  • 股票场外期权网站开发网站设计的主要特点
  • 文昌网站 做炸饺子浏览器怎么打开网站服务器
  • 网站有做货图片识别地点的软件
  • tv电视盒子企业网站模板外贸网站推广 雅虎问答有用吗
  • 温州网站制作网站遵义网站建设txwl