数据存储与访问之——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 对比,或特定场景的实现方案,请告诉我!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注