SharedPreferences 是 Android 提供的轻量级键值对存储工具,主要用于保存简单的配置信息(如用户偏好设置、登录状态等),数据以 XML 文件 或 SQLite 数据库 形式存储在设备内部目录中,适合存储少量、简单的数据。
步骤 | 方法/说明 | 示例代码 |
---|---|---|
获取实例 | getSharedPreferences(String name, int mode) name : 文件名mode : 操作模式(如 MODE_PRIVATE ) |
“`java |
SharedPreferences sp = getSharedPreferences(“config”, Context.MODE_PRIVATE);
| 2. 读取数据 | `getX(String key)`<br>支持 `String`、`int`、`float`、`long`、`boolean` 等类型 | ```java
String value = sp.getString("key_name", "default_value");
``` |
| 3. 写入数据 | `edit()` → `putX(String key, X value)` → `apply()` 或 `commit()`<br>`apply()`: 异步提交<br>`commit()`: 同步提交 | ```java
SharedPreferences.Editor editor = sp.edit();
editor.putInt("key_age", 25);
editor.apply(); // 推荐使用
``` |
---
# 三、支持的数据类型
| 数据类型 | 写入方法 | 读取方法 | 说明 |
|----------|----------|----------|------|
| String | putString(key, value) | getString(key, defValue) | 常用类型 |
| int | putInt(key, value) | getInt(key, defValue) | |
| float | putFloat(key, value) | getFloat(key, defValue) | |
| long | putLong(key, value) | getLong(key, defValue) | |
| boolean | putBoolean(key, value)| getBoolean(key, defValue) | |
---
# 四、注意事项
1. 线程安全
`apply()` 是异步操作,适合大多数场景;`commit()` 是同步操作,可能阻塞主线程。
多线程操作时建议加锁或使用 `apply()`。
2. 性能问题
SP 文件读写会触发 I/O 操作,频繁调用可能导致性能下降。
建议批量操作(如多次 `put` 后统一 `apply()`)。
3. 数据迁移与兼容性
新增键值对时需考虑旧版本兼容性(如设置默认值)。
删除文件需谨慎(`getSharedPreferences` 会自动创建文件)。
4. 存储复杂对象
仅支持基础数据类型,存储对象需手动序列化(如 `Gson` 转 JSON 字符串)。
---
# 五、与其他存储方式对比
| 特性 | SharedPreferences | 文件存储(File) | SQLite 数据库 |
|---------------|-------------------------|------------------------|-----------------------|
| 适用场景 | 轻量级键值配置 | 文本/二进制文件存储 | 复杂结构化数据 |
| 数据格式 | 键值对(XML/SQLite) | 自由格式 | 关系型表 |
| 性能 | 高(少量数据) | 中等 | 低(大量数据) |
| 开发复杂度 | 极低 | 低 | 较高 |
---
相关问题与解答
# 问题1:SharedPreferences 是否适合存储大量数据?
解答:
不适合,SharedPreferences 设计用于存储少量键值对,大量数据会导致以下问题:
性能下降(每次读写需加载整个文件)
文件体积过大,占用更多内存和存储空间
建议:超过百条数据时考虑使用 SQLite 或 Room 持久化库。
---
# 问题2:如何迁移 SharedPreferences 数据到新版本?
解答:
1. 新增键值对:在代码中检查键是否存在,不存在则赋予默认值。
```java
int versionCode = BuildConfig.VERSION_CODE;
if (sp.getInt("config_version", 0) < versionCode) {
// 执行数据迁移逻辑
sp.edit().putInt("config_version", versionCode).apply();
}
getSharedPreferences
自动创建新文件,旧文件会被系统清理(需用户卸载重装或手动清除数据