ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Jepack - DataStore

Jepack - DataStore 官方页面一、概念一种少量简单数据的存储解决方案使用 Kotlin 协程和 Flow 以异步、一致的事务方式存储数据。基于协程和Flow实现保证了主线程的安全性。以事务的方式进行处理保证了操作的原子性、一致性、隔离性及持久性。支持SharedPreferences的迁移保证数据的完整性。Preferences DataStore键值对存储数据零散开关。此实现不需要预定义的架构也不确保类型安全。Proto DataStore自定义数据类型的实例存储成组设置。要求使用协议缓冲区来定义架构但可以确保类型安全。二、添加依赖最新版本[versions] dataStore 1.1.7 [libraries] datastore-preferences { module androidx.datastore:datastore-preferences, version.ref dataStore} datastore-proto { module androidx.datastore:datastore, version.ref dataStore}三、Preferences DataStore存储位置/data/user/0/包名/files/datastore/文件后缀preferences_pb3.1 获取实例在 top-level 使用 preferencesDataStore() 提供的属性委托来获取 DataStorePreferences 实例扩展属性给到 Context 因为创建实例会用到上下文只提供 getValue() 因此属性是val。注意 preferencesDataStore() 不能保证对象单例如果在同一进程中为给定文件创建多个 DataStore 实例在读取或更新数据时将抛出 IllegalStateException异常。切勿在同一文件中混合使用 SingleProcessDataStore 和 MultiProcessDataStore。如果打算从多个进程访问 DataStore始终使用 MultiProcessDataStore。DataStore 的泛型类型必须是不可变的。 更改 DataStore 中使用的类型会使 DataStore 提供的任何保证失效并可能导致严重的、难以捕获的错误。强烈建议您使用协议缓冲区它们提供不可变性保证、简单的 API 和高效的序列化。public fun preferencesDataStore(name: String, //文件名corruptionHandler: ReplaceFileCorruptionHandlerPreferences? null,produceMigrations: (Context) - ListDataMigrationPreferences { listOf() },scope: CoroutineScope CoroutineScope(Dispatchers.IO SupervisorJob()) //可选协程配置): ReadOnlyPropertyContext, DataStorePreferencesval Context.dataStore: DataStorePreferences by preferencesDataStore(settings) //以下代码就是在同一进程为为给定文件创建多个 DataStore 实例 //val Context.dataStore2: DataStorePreferences by preferencesDataStore(name settings)3.2 创建 key不同创建方式代表 key 对应的 value 数据类型。intpublic fun intPreferencesKey(name: String): Preferences.KeyIntLongpublic fun longPreferencesKey(name: String): Preferences.KeyLongDoublepublic fun doublePreferencesKey(name: String): Preferences.KeyDoubleFloatpublic fun floatPreferencesKey(name: String): Preferences.KeyFloatBooleanpublic fun booleanPreferencesKey(name: String): Preferences.KeyBooleanByteArraypublic fun byteArrayPreferencesKey(name: String): Preferences.KeyByteArrayStringpublic fun stringPreferencesKey(name: String): Preferences.KeyStringSetStringpublic fun stringSetPreferencesKey(name: String): Preferences.KeySetStringval USER_ID longPreferencesKey(user_id)3.3 通过属性 datadatapublic val data: FlowT返回一个 Flow 数据流用来操作。3.3.1 读取//返回Flow类型 fun getUserIdFlow(): FlowLong MyApplication.context.dataStore.data.map { preferences - preferences[USER_ID] ?: 0 } //返回原始类型 suspend fun getUserId() MyApplication.context.dataStore.data.first()[USER_ID] ?: 03.3.2 查询contains()public abstract operator fun T contains(key: KeyT): Booleansuspend fun T isExist(key: Preferences.KeyT): Boolean MyApplication.context.dataStore.data.first().contains(key)3.3.3 监听单个监听fun T observeValue(key: Preferences.KeyT): FlowT? MyApplication.context.dataStore.data .map { preferences - preferences[key] } .distinctUntilChanged() lifecycleScope.launch { observeValue(USER_ID).collect { value - println(新的值是$value) } }多个监听data class UserInfo( val id: Long, val name: String ) val USER_ID longPreferencesKey(user_id) val USER_NAME stringPreferencesKey(user_name) fun observeUserInfo(): FlowUserInfo { val userId MyApplication.context.dataStore.data.map { preferences - preferences[USER_ID] ?: 0 }.distinctUntilChanged() val userName MyApplication.context.dataStore.data.map { preferences - preferences[USER_NAME] ?: }.distinctUntilChanged() return combine(userId,userName) { id, name - UserInfo(id, name) } } lifecycleScope.launch { observeUserInfo().collect { userInfo - println(新的用户信息是$userInfo) } }3.4 调用 edit()edit()public suspend fun DataStorePreferences.edit(transform: suspend (MutablePreferences) - Unit): Preferences作用域中提供一个 MutablePreferences 参数用来操作。3.4.1 写入suspend fun T setValue(key: Preferences.KeyT, value: T) MyApplication.context.dataStore.edit { mutablePreferences - mutablePreferences[key] value }3.4.2 删除remove()public fun T remove(key: Preferences.KeyT): T删除key对应的数据。suspend fun T deleteValue(key: Preferences.KeyT) MyApplication.context.dataStore.edit { mutablePreferences - mutablePreferences.remove(key) }3.4.3 清空clear()public fun clear()清空所有数据。suspend fun clearAllValues() MyApplication.context.dataStore.edit { mutablePreferences - mutablePreferences.clear() }四、Proto DataStore
返回列表