Lưu dữ liệu khoá-giá trị

Stay organized with collections Save and categorize content based on your preferences.

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.

Lưu ý: API SharedPreferences dùng để đọc và ghi các cặp khoá-giá trị và bạn không nên nhầm lẫn với API Preference giúp bạn tạo giao diện người dùng cho các chế độ cài đặt ứng dụng (mặc dù các API đó cũng sử dụng SharedPreferences để lưu các chế độ cài đặt của người dùng). Để biết thông tin về API Preference, xem bài viết Hướng dẫn cho nhà phát triển về các chế độ cài đặt.

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 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 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 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);

Thận trọng: Chúng tôi đã ngừng sử dụng chế độ MODE_WORLD_READABLEMODE_WORLD_WRITEABLE kể từ API cấp 17. Kể từ Android 7.0 (API cấp 24), Android sẽ đưa ra (throw) SecurityException nếu bạn sử dụng những chế độ đó. Nếu cần chia sẻ các tệp riêng tư với các ứng dụng khác, thì ứng dụng của bạn có thể sử dụng FileProvider bằng FLAG_GRANT_READ_URI_PERMISSION. Để biết thêm thông tin, xem thêm bài viết Chia sẻ tệp.

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, 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.

Lưu ý: Bạn có thể chỉnh sửa các lựa chọn ưu tiên dùng chung một cách an toàn hơn bằng cách gọi phương thức edit() trên đối tượng EncryptedSharedPreferences thay vì trên đối tượng SharedPreferences. Để tìm hiểu thêm, xem hướng dẫn về cách làm việc với dữ liệu một cách an toàn hơ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);