首页 Android 正文
  • 本文约2379字,阅读需12分钟
  • 163
  • 0

SharedPreferences vs DataStore:选择适合的轻量级键值存储方案

摘要

多年来,开发人员一直依赖 SharedPreferences 作为存储键值对的轻量级解决方案。然而,随着 Android 架构的演变和 Jetpack 组件的引入,一个新的竞争者出现了:Jetpack DataStore。在本文中,将比较它们的功能、性能和适用性,以便为现代 Android 开发选择合适的方案。 了解 SharedPreferences Sh...

多年来,开发人员一直依赖 SharedPreferences 作为存储键值对的轻量级解决方案。然而,随着 Android 架构的演变和 Jetpack 组件的引入,一个新的竞争者出现了:Jetpack DataStore。在本文中,将比较它们的功能、性能和适用性,以便为现代 Android 开发选择合适的方案。

了解 SharedPreferences

SharedPreferences 长期以来一直是 Android 开发中管理简单键值对的首选方法。它提供以下优点:

• 易于使用,设置简便

• 适用于存储用户偏好、设置和会话信息等少量数据

然而,SharedPreferences 也有一些局限性:

• 在 UI 线程上调用不安全

• 操作是同步的,可能会阻塞主线程

• 仅支持原始数据类型

• 不提供类型安全性

了解 Jetpack DataStore

Jetpack DataStore 是 Android Jetpack 库的一部分,是 SharedPreferences 的现代替代品。它提供以下优势:

• 可以通过序列化处理复杂数据对象

• 使用 Kotlin 协程内置支持异步操作

• 通过 Flow 或 LiveData 提供可观察性

• 支持加密

DataStore 提供两种实现选项:

Preferences DataStore:类似于 SharedPreferences,但性能和可扩展性更好

Proto DataStore:利用协议缓冲区有效地序列化复杂数据结构

关键差异和功能

Jetpack DataStore 和 SharedPreferences 之间的一些关键差异和功能:

数据类型支持

SharedPreferences:主要支持原始数据类型

Jetpack DataStore:可以通过序列化处理复杂数据对象

并发和线程

SharedPreferences:操作是同步的,可能会阻塞主线程

Jetpack DataStore:内置支持使用 Kotlin 协程进行异步操作

可观察性

SharedPreferences:不支持

Jetpack DataStore:通过 Flow 或 LiveData 提供可观察性,便于与 Android 架构组件无缝集成

向下兼容性

SharedPreferences:适用于所有 Android 版本

Jetpack DataStore:需要 Jetpack 兼容性,限制了其在旧项目中的使用

安全性

SharedPreferencesJetpack DataStore:都提供类似的安全级别,但 Jetpack DataStore 的加密支持提供了额外的保护

实现

比较一下两者的实现:

1. 初始化

// Shared Preference
val sharedPref = context.getSharedPreferences("my_preferences", Context.MODE_PRIVATE)

// DataStore
val dataStore: DataStore<Preferences> = context.createDataStore(name = "my_preferences")
// 添加 DataStore 依赖
dependencies {
    implementation "androidx.datastore:datastore-preferences:1.0.0"
    implementation "androidx.datastore:datastore-preferences-core:1.0.0"
}

2. 存储数据

// SharedPreference
val editor = sharedPref.edit()
editor.putBoolean("isFirstLaunch", true)
editor.putInt("userScore", 100)
editor.apply()

// DataStore
dataStore.edit { preferences ->
    preferences[booleanPreferencesKey("isFirstLaunch")] = true
    preferences[intPreferencesKey("userScore")] = 100
}

3. 获取数据

// SharedPreference
val isFirstLaunch = sharedPref.getBoolean("isFirstLaunch", false)
val userScore = sharedPref.getInt("userScore", 0)

// DataStore
val isFirstLaunchFlow: Flow<Boolean> = dataStore.data.map { preferences ->
    preferences[booleanPreferencesKey("isFirstLaunch")] ?: false
}
val userScoreFlow: Flow<Int> = dataStore.data.map { preferences ->
    preferences[intPreferencesKey("userScore")] ?: 0
}

选择合适的方案

在决定使用 Jetpack DataStore 还是 SharedPreferences 时,请考虑以下因素:

数据复杂性

• 如果你的应用需要存储简单的键值对或原始数据类型,请选择 SharedPreferences。

• 对于更复杂的数据结构或异步操作,Jetpack DataStore 是更好的选择。

性能

• Jetpack DataStore 在处理较大数据集和异步操作时优于 SharedPreferences,适合高性能应用。

兼容性

• 如果你的应用需要与旧版 Android 兼容,请选择 SharedPreferences。

作为开发人员,选择合适的数据存储机制要根据应用程序的需求。SharedPreferences 仍然是基本数据存储的合适选择,而 Preferences DataStore 则提供了更强大和高效的解决方案来管理偏好设置。


扫描二维码,在手机上阅读
    评论