Lưu dữ liệu đơn giản bằng SharedPreferences

Nếu có một tập hợp khoá-giá trị tương đối nhỏ cần lưu, bạn nên sử dụng các API SharedPreferences. Đối tượng SharedPreferences trỏ đến một tệp chứa các cặp khoá-giá trị và cung cấp các phương thức đơn giản để đọc và ghi các cặp khoá đó. Mỗi tệp SharedPreferences do khung này quản lý và có thể ở chế độ riêng tư hoặc dùng chung.

Trang này cho bạn biết cách sử dụng các API SharedPreferences để lưu trữ và truy xuất các giá trị đơn giản.

Tìm hiểu và học cách xử lý lựa chọn ưu tiên dùng chung

Bạn có thể tạo tệp lựa chọn ưu tiên dùng chung mới hoặc truy cập vào một tệp hiện có bằng cách gọi một trong các phương thức sau:

  • getSharedPreferences(): Sử dụng phương thức này nếu bạn cần nhiều tệp lựa chọn ưu tiên dùng chung được xác định theo tên mà bạn chỉ định bằng tham số đầu tiên. Bạn có thể gọi phương thức này từ Context bất kỳ trong ứng dụng của mình.
  • getPreferences(): Sử dụng phương thức này từ Activity nếu bạn chỉ cần sử dụng một tệp lựa chọn ưu tiên dùng chung cho hoạt động. Vì phương thức này truy xuất tệp lựa chọn ưu tiên chung mặc định thuộc về hoạt động, nên bạn không cần cung cấp tên.

Ví dụ: Mã sau đây truy cập vào tệp lựa chọn ưu tiên dùng chung mà chuỗi tài nguyên R.string.preference_file_key xác định và mở bằng chế độ riêng tư để chỉ ứng dụng của bạn mới có thể truy cập vào tệp:

Kotlin

val sharedPref = activity?.getSharedPreferences(
        getString(R.string.preference_file_key), Context.MODE_PRIVATE)

Java

Context context = getActivity();
SharedPreferences sharedPref = context.getSharedPreferences(
        getString(R.string.preference_file_key), Context.MODE_PRIVATE);

Khi đặt tên cho tệp lựa chọn ưu tiên dùng chung, bạn nên sử dụng tên có thể xác định danh tính chính xác đối với ứng dụng của mình. Thêm tiền tố là ID ứng dụng vào tên tệp sẽ giúp bạn dễ dàng thực hiện việc này. Ví dụ: "com.example.myapp.PREFERENCE_FILE_KEY"

Ngoài ra, nếu chỉ cần một tệp lựa chọn ưu tiên dùng chung cho hoạt động của mình, bạn có thể sử dụng phương thức getPreferences():

Kotlin

val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE)

Java

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);

Nếu đang sử dụng API SharedPreferences để lưu chế độ cài đặt ứng dụng, thì bạn nên sử dụng getDefaultSharedPreferences() để tải tệp lựa chọn ưu tiên dùng chung mặc định cho toàn bộ ứng dụng của mình. Để biết thêm thông tin, hãy xem bài viết Hướng dẫn cho nhà phát triển về các chế độ cài đặt.

Ghi vào lựa chọn ưu tiên dùng chung

Để ghi vào tệp lựa chọn ưu tiên dùng chung, hãy tạo SharedPreferences.Editor bằng cách gọi edit() trên SharedPreferences của bạn.

Truyền các khoá và giá trị mà bạn muốn ghi bằng các phương thức như: putInt()putString(). Sau đó, hãy gọi apply() hoặc commit() để lưu các thay đổi. Ví dụ:

Kotlin

val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE) ?: return
with (sharedPref.edit()) {
    putInt(getString(R.string.saved_high_score_key), newHighScore)
    apply()
}

Java

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt(getString(R.string.saved_high_score_key), newHighScore);
editor.apply();

apply() thay đổi ngay đối tượng SharedPreferences trong bộ nhớ nhưng ghi nội dung cập nhật vào ổ đĩa một cách không đồng bộ. Ngoài ra, bạn có thể sử dụng commit() để ghi dữ liệu vào ổ đĩa một cách đồng bộ. Tuy nhiên, commit() có tính đồng bộ nên bạn cần tránh gọi từ luồng chính, vì tính năng này có thể tạm dừng việc hiển thị giao diện người dùng.

Đọc từ lựa chọn ưu tiên dùng chung

Để truy xuất các giá trị từ một tệp lựa chọn ưu tiên dùng chung, hãy gọi các phương thức như getInt()getString(), cung cấp khoá cho giá trị bạn muốn và có thể chọn làm giá trị mặc định để trả về nếu không có khoá. Ví dụ:

Kotlin

val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE) ?: return
val defaultValue = resources.getInteger(R.integer.saved_high_score_default_key)
val highScore = sharedPref.getInt(getString(R.string.saved_high_score_key), defaultValue)

Java

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
int defaultValue = getResources().getInteger(R.integer.saved_high_score_default_key);
int highScore = sharedPref.getInt(getString(R.string.saved_high_score_key), defaultValue);