Android SharedPreferences 存取对象

简介

在 Android 开发中,我们经常需要存储一些用户的配置信息或者应用的状态。SharedPreferences 是 Android 提供的一种轻量级的数据存储方式,它以键值对的形式存储数据,并且可以跨越不同的 Activity 或 Fragment 使用。

本文将介绍如何使用 SharedPreferences 存取对象,并提供一些代码示例来帮助读者更好地理解。

SharedPreferences 概述

SharedPreferences 是一个 XML 文件,用于存储键值对数据。每个 SharedPreferences 文件都有一个唯一的名称,可以通过该名称来创建或者获取该文件的实例。

SharedPreferences 文件存储在应用的私有目录下,其他应用无法访问。每个应用都有自己独立的 SharedPreferences 文件,不同应用之间的 SharedPreferences 文件不会互相干扰。

SharedPreferences 文件可以通过 Context 类的 getSharedPreferences() 方法来获取,该方法接受两个参数:文件名称和访问权限模式。访问权限模式有两种:MODE_PRIVATE 和 MODE_MULTI_PROCESS。

存储对象

在 Android 中,SharedPreferences 只能存储基本数据类型,如字符串、整数、浮点数等。但我们可以通过一些技巧将对象转化为可存储的格式,从而实现存储对象的功能。

最常见的做法是将对象转化为 JSON 字符串,然后存储该字符串。在需要获取对象时,再将 JSON 字符串转化为对象。Android 提供了 Gson 库来帮助我们进行 JSON 格式和对象之间的转换。

下面是一个示例,演示了如何使用 SharedPreferences 存储和获取一个自定义对象:

// 定义一个自定义对象
public class User {
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 省略 getter 和 setter 方法

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

// 存储对象
public void saveUser(User user) {
    SharedPreferences sharedPreferences = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    
    // 使用 Gson 将对象转化为 JSON 字符串
    Gson gson = new Gson();
    String json = gson.toJson(user);

    editor.putString("user", json);
    editor.apply();
}

// 获取对象
public User getUser() {
    SharedPreferences sharedPreferences = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
    
    // 获取 JSON 字符串
    String json = sharedPreferences.getString("user", "");

    // 使用 Gson 将 JSON 字符串转化为对象
    Gson gson = new Gson();
    User user = gson.fromJson(json, User.class);
    
    return user;
}

上述代码中,我们定义了一个 User 类作为示例的自定义对象。在存储对象时,我们使用 Gson 库将对象转化为 JSON 字符串,并将该字符串存储到 SharedPreferences 文件中。在获取对象时,我们先从 SharedPreferences 文件中获取 JSON 字符串,然后使用 Gson 将该字符串转化为对象。

需要注意的是,存储和获取对象的方法应该在同一个 SharedPreferences 文件中执行,以保证数据的一致性。

示例应用

为了更好地理解 SharedPreferences 存取对象的应用场景,我们创建一个简单的示例应用。该应用允许用户输入自己的姓名和年龄,并保存在 SharedPreferences 中,以便下次打开应用时直接获取。

下面是示例应用的代码:

public class MainActivity extends AppCompatActivity {
    private EditText etName;
    private EditText etAge;

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

        etName = findViewById(R.id.et_name);
        etAge = findViewById(R.id.et_age);

        // 读取保存的用户信息
        User user = getUser();
        if (user != null) {
            etName.setText(user.getName());
            etAge.setText(String.valueOf(user.getAge()));
        }
    }

    public void onSaveClick(View view) {
        String name = etName.getText().toString();
        int age = Integer.parseInt(etAge.getText().toString());
        User user = new User(name, age);
        saveUser(user);
        Toast.makeText(this, "保存成功", Toast.LENGTH_SHORT).show();
    }

    private void saveUser(User user) {
        SharedPreferences sharedPreferences = getSharedPreferences("MyPrefs", Context.MODE