Android 数据存储:SharedPreferences 深入教程

在 Android 开发中,数据存储是一个至关重要的部分。Android 提供了多种数据存储方式,其中 SharedPreferences 是一种轻量级的存储方式,适用于存储简单的键值对数据。本文将详细介绍 SharedPreferences 的使用,包括其优缺点、注意事项以及丰富的示例代码。

1. 什么是 SharedPreferences?

SharedPreferences 是 Android 提供的一种轻量级的数据存储方式,主要用于存储应用的配置信息和用户的偏好设置。它以键值对的形式存储数据,适合存储少量的基本数据类型,如 Stringintbooleanfloatlong

1.1 适用场景

  • 存储用户的登录状态
  • 存储用户的设置(如主题、语言等)
  • 存储简单的应用配置

2. SharedPreferences 的优缺点

2.1 优点

  • 简单易用:API 设计简单,易于上手。
  • 轻量级:适合存储少量数据,不需要复杂的数据库操作。
  • 持久化:数据存储在 XML 文件中,应用重启后数据依然存在。

2.2 缺点

  • 数据量限制:不适合存储大量数据或复杂数据结构。
  • 性能问题:频繁的读写操作可能影响性能,尤其是在主线程中。
  • 不支持复杂数据类型:只能存储基本数据类型,无法直接存储对象。

3. 使用 SharedPreferences

3.1 获取 SharedPreferences 实例

要使用 SharedPreferences,首先需要获取其实例。可以通过 ContextgetSharedPreferences() 方法获取。

SharedPreferences sharedPreferences = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
  • 参数说明
    • "MyPrefs":文件名,存储数据的 XML 文件名。
    • Context.MODE_PRIVATE:表示该文件只能被当前应用访问。

3.2 存储数据

使用 SharedPreferences.Editor 来存储数据。以下是存储不同类型数据的示例:

SharedPreferences.Editor editor = sharedPreferences.edit();

// 存储字符串
editor.putString("username", "JohnDoe");

// 存储整型
editor.putInt("age", 30);

// 存储布尔值
editor.putBoolean("isLoggedIn", true);

// 存储浮点数
editor.putFloat("height", 5.9f);

// 存储长整型
editor.putLong("lastLoginTime", System.currentTimeMillis());

// 提交更改
editor.apply(); // 或者 editor.commit();
  • apply():异步提交更改,适合大多数场景。
  • commit():同步提交,返回布尔值表示提交是否成功,适合需要立即确认的场景。

3.3 读取数据

读取数据时,可以使用 get 方法获取存储的数据。以下是读取数据的示例:

String username = sharedPreferences.getString("username", "defaultUser");
int age = sharedPreferences.getInt("age", 0);
boolean isLoggedIn = sharedPreferences.getBoolean("isLoggedIn", false);
float height = sharedPreferences.getFloat("height", 0.0f);
long lastLoginTime = sharedPreferences.getLong("lastLoginTime", 0L);
  • 第二个参数:表示默认值,如果没有找到对应的键,则返回该默认值。

3.4 删除数据

可以使用 remove() 方法删除特定的键值对,或者使用 clear() 方法清空所有数据。

// 删除特定键
editor.remove("username");

// 清空所有数据
editor.clear();

// 提交更改
editor.apply();

3.5 监听数据变化

SharedPreferences 还提供了监听数据变化的功能,可以通过 OnSharedPreferenceChangeListener 来实现。

sharedPreferences.registerOnSharedPreferenceChangeListener(new SharedPreferences.OnSharedPreferenceChangeListener() {
    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        // 处理数据变化
        if (key.equals("isLoggedIn")) {
            boolean isLoggedIn = sharedPreferences.getBoolean(key, false);
            // 更新 UI 或执行其他操作
        }
    }
});

4. 注意事项

  • 线程安全SharedPreferences 是线程安全的,但在频繁读写的情况下,建议使用 apply() 方法以避免阻塞主线程。
  • 数据量控制:避免将大量数据存储在 SharedPreferences 中,适合存储简单的配置信息。
  • 数据加密:如果存储敏感信息,建议使用 Android 的 EncryptedSharedPreferences 进行加密存储。

5. 示例应用

以下是一个简单的示例应用,演示如何使用 SharedPreferences 存储和读取用户的登录状态。

public class MainActivity extends AppCompatActivity {
    private SharedPreferences sharedPreferences;
    private EditText usernameEditText;
    private CheckBox rememberMeCheckBox;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        sharedPreferences = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
        usernameEditText = findViewById(R.id.usernameEditText);
        rememberMeCheckBox = findViewById(R.id.rememberMeCheckBox);

        // 读取存储的用户名
        String savedUsername = sharedPreferences.getString("username", "");
        boolean isRemembered = sharedPreferences.getBoolean("isRemembered", false);

        if (isRemembered) {
            usernameEditText.setText(savedUsername);
            rememberMeCheckBox.setChecked(true);
        }

        findViewById(R.id.loginButton).setOnClickListener(v -> {
            String username = usernameEditText.getText().toString();
            boolean rememberMe = rememberMeCheckBox.isChecked();

            // 存储用户名和记住我状态
            SharedPreferences.Editor editor = sharedPreferences.edit();
            editor.putString("username", username);
            editor.putBoolean("isRemembered", rememberMe);
            editor.apply();

            // 进行登录操作
            // ...
        });
    }
}

结论

SharedPreferences 是 Android 中一种简单而有效的数据存储方式,适合存储少量的配置信息和用户偏好设置。通过本文的详细介绍和示例代码,相信你已经掌握了 SharedPreferences 的基本用法及其优缺点。在实际开发中,合理选择数据存储方式,将有助于提升应用的性能和用户体验。