数据存储与访问之——SharedPreferences保存用户偏好参数
SharedPreferences 是 Android 开发中一种轻量级的数据存储方式,常用于保存用户偏好参数或少量键值对数据(如设置项、用户配置)。它以 XML 文件形式存储在应用的私有目录中,适合简单数据持久化。以下是对 SharedPreferences 的概述,涵盖核心概念、使用方法和注意事项,保持简洁并聚焦主题。
1. 基本概念
- 定义:SharedPreferences 提供键值对存储机制,数据存储在
/data/data/包名/shared_prefs/
目录下的 XML 文件中。 - 适用场景:保存用户偏好(如主题、字体大小、开关状态)、轻量级配置等。
- 特点:
- 轻量、易用,适合小规模数据。
- 键值对格式,支持基本数据类型(String、int、float、boolean、long、StringSet)。
- 应用私有,数据隔离。
- 非线程安全,需注意并发操作。
2. 基本使用方法
以下以 Android(Java/Kotlin)为例,展示 SharedPreferences 的读写操作:
获取 SharedPreferences
// Java
SharedPreferences prefs = getSharedPreferences("MyPrefs", MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
// Kotlin
val prefs = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE)
val editor = prefs.edit()
- 文件名:
MyPrefs
是 XML 文件名,生成MyPrefs.xml
。 - 模式:
MODE_PRIVATE
:仅本应用可访问(默认)。MODE_WORLD_READABLE
/MODE_WORLD_WRITEABLE
:已废弃,安全性低。
保存数据
// Java
editor.putString("username", "Alice");
editor.putInt("age", 25);
editor.putBoolean("isDarkMode", true);
editor.apply(); // 异步提交
// 或 editor.commit(); // 同步提交
// Kotlin
editor.apply {
putString("username", "Alice")
putInt("age", 25)
putBoolean("isDarkMode", true)
}.apply() // 异步提交
读取数据
// Java
String username = prefs.getString("username", "default"); // 默认值
int age = prefs.getInt("age", 0);
boolean isDarkMode = prefs.getBoolean("isDarkMode", false);
// Kotlin
val username = prefs.getString("username", "default") ?: "default"
val age = prefs.getInt("age", 0)
val isDarkMode = prefs.getBoolean("isDarkMode", false)
删除数据
// Java
editor.remove("username"); // 删除单个键
editor.clear(); // 清空所有数据
editor.apply();
// Kotlin
editor.remove("username").apply() // 删除单个键
editor.clear().apply() // 清空
3. 注意事项
- 异步 vs 同步:
apply()
:异步写入,性能更好,适合大多数场景。commit()
:同步写入,返回布尔值表示成功与否,适合需要确认写入的场景。- 数据类型限制:仅支持基本类型和 StringSet,复杂对象需序列化(如 JSON)。
// 保存复杂对象
import com.google.gson.Gson;
MyObject obj = new MyObject();
String json = new Gson().toJson(obj);
editor.putString("myObject", json).apply();
- 性能:不适合存储大量数据(>1MB),否则影响性能,推荐用 Room 数据库或文件存储。
- 线程安全:多线程访问需加锁或使用单线程(如主线程)。
- 默认值:读取时总是提供默认值,避免空值异常。
- 安全性:数据以明文存储,敏感信息(如密码)需加密。
4. 高级用法
- 多文件管理:不同偏好用不同文件名区分。
SharedPreferences userPrefs = getSharedPreferences("UserPrefs", MODE_PRIVATE);
SharedPreferences appPrefs = getSharedPreferences("AppPrefs", MODE_PRIVATE);
- 监听变化:通过
OnSharedPreferenceChangeListener
监听偏好变化。
prefs.registerOnSharedPreferenceChangeListener((sharedPreferences, key) -> {
Log.d("Prefs", key + " changed");
});
- 跨进程:
MODE_MULTI_PROCESS
(已废弃),现推荐 ContentProvider 或数据库。
5. 实际应用
- 保存用户设置:如夜间模式、通知开关、语言选择。
- 缓存轻量数据:如最后登录时间、会话标记。
- 临时状态:如引导页是否已显示。
6. 替代方案
- Room 数据库:适合复杂数据和查询需求。
- DataStore:Android 推荐的现代偏好存储方案,支持异步、类型安全。
- 文件存储:适合大文件或复杂结构(如 JSON、XML)。
如果需要更详细的代码示例、DataStore 对比,或特定场景的实现方案,请告诉我!