Thông thường bạn sẽ sử dụng SQLite hoặc Realm để lưu trữ dữ liệu trong các ứng dụng Android, SharedPreferences cũng có thể thực hiện lưu trữ dữ liệu tùy vào mục đích sử dụng của bạn.
- SharedPreferences lưu trữ và truy xuất dữ liệu dưới dạng key – value.
- SharedPreferences hỗ trợ kiểu dữ liệu bao gồm string, int, boolean, float, long.
- Dữ liệu được lưu trữ trong SharedPreferences sẽ bị mất đi trong trường hợp như khi bạn gỡ cài đặt ứng dụng, xóa dữ liệu ứng dụng thông qua cài đặt…
2. Trường hợp nên sử dụng SharedPreferences?
SharedPreferences có phải là giải pháp thay thế hoàn hảo cho SQLite hay Realm không?
- SharedPreferences có thể thực hiện lưu trữ và truy xuất dữ liệu trong ứng dụng Android tuy nhiên nó có khá nhiều hạn chế so với SQLite hoặc Realm. Vậy SharedPreferences nên được sử dụng trong trường hợp ứng dụng của bạn lưu trữ các dữ liệu nhỏ hoặc những dữ liệu không quá phức tạp.
- SharedPreferences chỉ hỗ trợ lưu trữ dưới dạng key – value nên nếu áp dụng để truy vấn dữ liệu liên kết giữa các bảng sẽ gây ra khó khăn hơn.
- SharedPreferences thường được các lập trình viên sử dụng lưu trữ các thông tin dạng cấu hình ứng dụng, cài đặt… thay vì SQLite, Realm bởi SharedPreferences đơn giản và nhanh hơn nhiều.
3. Sử dụng SharedPreferences trong Android?
Sử dụng phương thức getSharedPreferences(String name, intmode) giúp bạn có thể gọi SharedPreferences từ bất kỳ Context nào trong ứng dụng của bạn.
SharedPreferences sharedPref = context.getSharedPreferences("MyPreferences", Context.MODE_PRIVATE);
Thuộc tính “name” là tên tập tin SharedPreferences còn thuộc tính “mode” là chế độ lưu trữ SharedPreferences.
Một số chế độ lưu trữ (MODE) được sử dụng trong SharedPreference:
Thuộc tính Mô tả MODE_PRIVATE Đây là chế độ lưu trữ riêng tư không cho phép các ứng dụng khác có thể truy cập vào tập tin SharedPreference trong ứng dụng. MODE_WORLD_READABLE Đây là chế độ lưu trữ cho phép các ứng dụng khác chỉ có thể đọc dữ liệu từ tập tin SharedPreference trong ứng dụng của bạn nhưng không được phép ghi dữ liệu. MODE_WORLD_WRITEABLE Đây là chế độ lưu trữ cho phép các ứng dụng khác có thể ghi dữ liệu vào trong tập tin SharedPreference trong ứng dụng của bạn.
4. Ghi dữ liệu vào SharedPreferences
Để ghi dữ liệu vào một tập tin SharedPreferences trong Android bạn hãy tạo đối tượng SharedPreferences.Editor bằng cách gọi phương thức edit().
SharedPreferences sharedPref = context.getSharedPreferences("MyPreferences", Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPref.edit(); editor.putString("url", "teamvietdev.com"); editor.putString("name", "Team Việt Dev"); editor.putBoolean("active", true); editor.commit();
Bảng sau liệt kê một số thuộc tính cơ bản được sử dụng trong SharedPreferences:
Thuộc tính Mô tả apply() Cập nhật dữ liệu mà không cần trả về kết quả thực thi lệnh thành công hay thất bại. commit() Cập nhật dữ liệu và trả về kết quả là true nếu thực thi lệnh thành công và trả về false nếu thất bại. clear() Xóa toàn bộ dữ liệu trong Shared Preference. remove(String key) Xóa dữ liệu trong Shared Preference dựa vào “key” tương ứng. putString(String key, String value) Lưu trữ dữ liệu kiểu String theo “key – value” putLong(String key, long value) Lưu trữ dữ liệu kiểu long theo “key – value” putInt(String key, int value) Lưu trữ dữ liệu kiểu int theo “key – value” putFloat(String key, float value) Lưu trữ dữ liệu kiểu float theo “key – value” putBoolean(String key, float value) Lưu trữ dữ liệu kiểu boolean theo “key – value”
Phương thức commit() lưu trữ dữ liệu đồng bộ (synchronously) còn với apply() là không đồng bộ (asynchronously). Sử dụng phương thức apply() sẽ thực thi lệnh nhanh hơn so với commit().
5. Đọc dữ liệu từ SharedPreferences:
Đọc dữ liệu từ SharedPreferences thì gọi phương thức như sau:
get<TypeData>("key_name", "value_default");
Bạn có thể gán dữ liệu mặc định trong “value_default” nếu dữ liệu trả về trong “key_name” không lấy được hoặc rỗng.
SharedPreferences sharedPref = context.getSharedPreferences("MyPreferences", Context.MODE_PRIVATE); String url = sharedPref.getString("url", ""); String name = sharedPref.getString("name", ""); boolean active = sharedPref.getBoolean("active", false);
Lời kết: Như vậy có nhiều cách để thực hiện lưu trữ và truy xuất dữ liệu như sử dụng SQLite, Realm hoặc có thể là sử dụng SharedPreferences trong Android tùy theo mục đích sử dụng mà bạn chọn thư viện phù hợp. Hẹn gặp lại các bạn trong các bài viết tiếp theo trong chuyên mục lập trình Android với nhiều bài viết hướng dẫn, tài liệu, lập trình Android.
Giới thiệu và hướng dẫn lưu trữ dữ liệu cơ bản trong Android bằng Shared Preferences.
Giới thiệu
Trong Android có nhiều cácH lưu trữ dữ liệu với nhiều mục đích khác nhau:
- Sử dụng SQLite để lưu trữ các dữ liệu dưới dạng bảng, truy xuất theo phong cách database.
- Lưu trữ tập tin ở Internal Storage, External Storage.
- Lưu trữ dữ liệu trên server và thông qua webservice để thao tác với dữ liệu đó.
Bài viết này hướng dẫn 1 cách lưu trữ đơn giản trong Android là sử dụng SharedPreferences.
Shared Preferences là gì?
Shared Preferences là 1 cách lưu trữ những dữ liệu dạng nguyên thủy (bool, int,
editor.putBoolean("key_name1", true); // Saving boolean editor.putInt("key_name2", "int value"); // Saving int editor.putFloat("key_name3", "float value"); // Saving float editor.putLong("key_name4", "long value"); // Saving long editor.putString("key_name5", "string value"); // Saving string
editer.apply(); // (*)
0,
editor.putBoolean("key_name1", true); // Saving boolean editor.putInt("key_name2", "int value"); // Saving int editor.putFloat("key_name3", "float value"); // Saving float editor.putLong("key_name4", "long value"); // Saving long editor.putString("key_name5", "string value"); // Saving string
editer.apply(); // (*)
1,
editor.putBoolean("key_name1", true); // Saving boolean editor.putInt("key_name2", "int value"); // Saving int editor.putFloat("key_name3", "float value"); // Saving float editor.putLong("key_name4", "long value"); // Saving long editor.putString("key_name5", "string value"); // Saving string
editer.apply(); // (*)
- trong Android dưới dạng file XML với những cặp key/value, ví dụ lưu trữ điểm số của game.
Để làm việc với Shared Preferences, Android SDK có cung cấp 2 class là SharedPreferences và
editor.putBoolean("key_name1", true); // Saving boolean editor.putInt("key_name2", "int value"); // Saving int editor.putFloat("key_name3", "float value"); // Saving float editor.putLong("key_name4", "long value"); // Saving long editor.putString("key_name5", "string value"); // Saving string
editer.apply(); // (*)
4.
Lưu trữ và lấy dữ liệu với Shared Preferences
Tạo SharedPreferences và SharePreferences.Editor
SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPreferences.edit();
- Dòng 1: đối số
editor.putBoolean("key_name1", true); // Saving boolean
editor.putInt("key_name2", "int value"); // Saving int
editor.putFloat("key_name3", "float value"); // Saving float
editor.putLong("key_name4", "long value"); // Saving long
editor.putString("key_name5", "string value"); // Saving string
editer.apply(); // ()
5 là
editor.putBoolean("key_name1", true); // Saving boolean
editor.putInt("key_name2", "int value"); // Saving int
editor.putFloat("key_name3", "float value"); // Saving float
editor.putLong("key_name4", "long value"); // Saving long
editor.putString("key_name5", "string value"); // Saving string
editer.apply(); // ()
2, chỉ cần nhập tên file không cần nhập phần mở rộng file .xml.
- Được lưu tại editor.putBoolean("key_name1", true); // Saving boolean editor.putInt("key_name2", "int value"); // Saving int editor.putFloat("key_name3", "float value"); // Saving float editor.putLong("key_name4", "long value"); // Saving long editor.putString("key_name5", "string value"); // Saving string editer.apply(); // (*) 7.
- Dòng 2: để lưu trữ dữ liệu cần tạo 1 đối tượng editor.putBoolean("key_name1", true); // Saving boolean editor.putInt("key_name2", "int value"); // Saving int editor.putFloat("key_name3", "float value"); // Saving float editor.putLong("key_name4", "long value"); // Saving long editor.putString("key_name5", "string value"); // Saving string editer.apply(); // () 8 từ editor.putBoolean("key_name1", true); // Saving boolean editor.putInt("key_name2", "int value"); // Saving int editor.putFloat("key_name3", "float value"); // Saving float editor.putLong("key_name4", "long value"); // Saving long editor.putString("key_name5", "string value"); // Saving string editer.apply(); // () 9.
Lưu dữ liệu vào SharedPreferences
Sau đó sử dụng các phương thức có tiền tố
boolean userFirstLogin = sharedPreferences.getBoolean("key_name1", true); // getting boolean int pageNumber = sharedPreferences.getInt("key_name2", 0); // getting int float amount = sharedPreferences.getFloat("key_name3", 0.0f); // getting Float long distance = sharedPreferences.getLong("key_name4", 0); // getting Long String email = sharedPreferences.getString("key_name5", null); // getting String
0 để lưu trữ cặp key/value.
Sau khi đặt các giá trị thì gọi phương thức
boolean userFirstLogin = sharedPreferences.getBoolean("key_name1", true); // getting boolean int pageNumber = sharedPreferences.getInt("key_name2", 0); // getting int float amount = sharedPreferences.getFloat("key_name3", 0.0f); // getting Float long distance = sharedPreferences.getLong("key_name4", 0); // getting Long String email = sharedPreferences.getString("key_name5", null); // getting String
1 hoặc
boolean userFirstLogin = sharedPreferences.getBoolean("key_name1", true); // getting boolean int pageNumber = sharedPreferences.getInt("key_name2", 0); // getting int float amount = sharedPreferences.getFloat("key_name3", 0.0f); // getting Float long distance = sharedPreferences.getLong("key_name4", 0); // getting Long String email = sharedPreferences.getString("key_name5", null); // getting String
2 để tiến hành ghi các giá trị xuống ứng dụng dưới dạng file .xml.
Nếu đã đặt dữ liệu mà không gọi phương thức
boolean userFirstLogin = sharedPreferences.getBoolean("key_name1", true); // getting boolean int pageNumber = sharedPreferences.getInt("key_name2", 0); // getting int float amount = sharedPreferences.getFloat("key_name3", 0.0f); // getting Float long distance = sharedPreferences.getLong("key_name4", 0); // getting Long String email = sharedPreferences.getString("key_name5", null); // getting String
3 hoặc
boolean userFirstLogin = sharedPreferences.getBoolean("key_name1", true); // getting boolean int pageNumber = sharedPreferences.getInt("key_name2", 0); // getting int float amount = sharedPreferences.getFloat("key_name3", 0.0f); // getting Float long distance = sharedPreferences.getLong("key_name4", 0); // getting Long String email = sharedPreferences.getString("key_name5", null); // getting String
4 thì những thay đổi này vẫn không được ghi xuống file .xml, vì vậy nếu có thay đổi thì phải gọi phương thức
boolean userFirstLogin = sharedPreferences.getBoolean("key_name1", true); // getting boolean int pageNumber = sharedPreferences.getInt("key_name2", 0); // getting int float amount = sharedPreferences.getFloat("key_name3", 0.0f); // getting Float long distance = sharedPreferences.getLong("key_name4", 0); // getting Long String email = sharedPreferences.getString("key_name5", null); // getting String
3 hoặc
boolean userFirstLogin = sharedPreferences.getBoolean("key_name1", true); // getting boolean int pageNumber = sharedPreferences.getInt("key_name2", 0); // getting int float amount = sharedPreferences.getFloat("key_name3", 0.0f); // getting Float long distance = sharedPreferences.getLong("key_name4", 0); // getting Long String email = sharedPreferences.getString("key_name5", null); // getting String
4 để lưu trữ những thay đổi đó.
Ví dụ:
editor.putBoolean("key_name1", true); // Saving boolean editor.putInt("key_name2", "int value"); // Saving int editor.putFloat("key_name3", "float value"); // Saving float editor.putLong("key_name4", "long value"); // Saving long editor.putString("key_name5", "string value"); // Saving string
editer.apply(); // (*)
Nhận dữ liệu từ SharedPreferences
Để nhận dữ liệu từ
boolean userFirstLogin = sharedPreferences.getBoolean("key_name1", true); // getting boolean int pageNumber = sharedPreferences.getInt("key_name2", 0); // getting int float amount = sharedPreferences.getFloat("key_name3", 0.0f); // getting Float long distance = sharedPreferences.getLong("key_name4", 0); // getting Long String email = sharedPreferences.getString("key_name5", null); // getting String
7 , không cần tạo đối tượng
editor.putBoolean("key_name1", true); // Saving boolean editor.putInt("key_name2", "int value"); // Saving int editor.putFloat("key_name3", "float value"); // Saving float editor.putLong("key_name4", "long value"); // Saving long editor.putString("key_name5", "string value"); // Saving string
editer.apply(); // (*)
8 mà có thể sử dụng chính đối tượng
editor.putBoolean("key_name1", true); // Saving boolean editor.putInt("key_name2", "int value"); // Saving int editor.putFloat("key_name3", "float value"); // Saving float editor.putLong("key_name4", "long value"); // Saving long editor.putString("key_name5", "string value"); // Saving string
editer.apply(); // (*)
9 với các phương thức là
editor.remove("key_name3"); // delete data by key key_name3 editor.remove("key_name4"); // delete data by key key_name4
editer.apply(); // Apply changes
0:
Với X là
editor.remove("key_name3"); // delete data by key key_name3 editor.remove("key_name4"); // delete data by key key_name4
editer.apply(); // Apply changes
1, int,
editor.putBoolean("key_name1", true); // Saving boolean editor.putInt("key_name2", "int value"); // Saving int editor.putFloat("key_name3", "float value"); // Saving float editor.putLong("key_name4", "long value"); // Saving long editor.putString("key_name5", "string value"); // Saving string
editer.apply(); // (*)
0,
editor.remove("key_name3"); // delete data by key key_name3 editor.remove("key_name4"); // delete data by key key_name4
editer.apply(); // Apply changes
4,
editor.putBoolean("key_name1", true); // Saving boolean editor.putInt("key_name2", "int value"); // Saving int editor.putFloat("key_name3", "float value"); // Saving float editor.putLong("key_name4", "long value"); // Saving long editor.putString("key_name5", "string value"); // Saving string
editer.apply(); // (*)
2, phương thức mô tả đúng giá trị ứng với key trong
editor.remove("key_name3"); // delete data by key key_name3 editor.remove("key_name4"); // delete data by key key_name4
editer.apply(); // Apply changes
6. Nếu không có key sẽ trả về giá trị
editor.remove("key_name3"); // delete data by key key_name3 editor.remove("key_name4"); // delete data by key key_name4
editer.apply(); // Apply changes
7.
Ví dụ:
boolean userFirstLogin = sharedPreferences.getBoolean("key_name1", true); // getting boolean int pageNumber = sharedPreferences.getInt("key_name2", 0); // getting int float amount = sharedPreferences.getFloat("key_name3", 0.0f); // getting Float long distance = sharedPreferences.getLong("key_name4", 0); // getting Long String email = sharedPreferences.getString("key_name5", null); // getting String
Xoá dữ liệu (key/value) từ SharedPreferences
Sử dụng phương thức
editor.remove("key_name3"); // delete data by key key_name3 editor.remove("key_name4"); // delete data by key key_name4
editer.apply(); // Apply changes
8:
editor.remove("key_name3"); // delete data by key key_name3 editor.remove("key_name4"); // delete data by key key_name4
editer.apply(); // Apply changes
Xoá tất cả dữ liệu từ SharedPreferences
Sử dụng phương thức
editor.remove("key_name3"); // delete data by key key_name3 editor.remove("key_name4"); // delete data by key key_name4
editer.apply(); // Apply changes
9 của đối tượng editor.
editor.clear(); editor.apply(); // Apply changes
Thực hành SharedPreferences
Tạo màn hình cài đặt và lưu trữ các cài đặt của game.
Tạo project có tên là SharedPreferences, giao diện sau khi tạo xong project:
File main_activity.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="//schemas.android.com/apk/res/android" xmlns:tools="//schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.nguyennghia.sharedpreference.MainActivity">
<LinearLayout android:id="@+id/ll_settings" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" android:layout_margin="16dp" android:orientation="vertical">
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:weightSum="9">
<CheckBox android:id="@+id/cb_volume" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_weight="3" android:button="@null" android:checked="true" android:drawableRight="?android:attr/listChoiceIndicatorMultiple" android:text="Volume" />
<SeekBar android:id="@+id/sb_volume" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="6" android:max="100" /> </LinearLayout>
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:weightSum="9">
<CheckBox android:id="@+id/cb_sound_effect" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_weight="3" android:button="@null" android:drawableRight="?android:attr/listChoiceIndicatorMultiple" android:text="Sound Effect" />
<SeekBar android:id="@+id/sb_sound_effect" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="6" android:max="100" /> </LinearLayout> </LinearLayout>
<Button android:id="@+id/btn_save" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/ll_settings" android:layout_centerHorizontal="true" android:layout_marginTop="16dp" android:text="Save" /> </RelativeLayout>
Tiếp theo là xử lý logic để lưu trữ các giá trị settings game sử dụng SharedPreferences.
package com.example.nguyennghia.sharedpreference; import android.content.Context; import android.content.SharedPreferences; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.CheckBox; import android.widget.CheckedTextView; import android.widget.CompoundButton; import android.widget.SeekBar;
public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; private static final String SHARED_PREFERENCE_NAME = "SettingGame"; private CheckBox cbVolume; private CheckBox cbSoundEffect; private SeekBar sbVolume; private SeekBar sbSoundEffect; private Button btnSave;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); cbVolume = (CheckBox) findViewById(R.id.cb_volume); cbSoundEffect = (CheckBox) findViewById(R.id.cb_sound_effect); sbVolume = (SeekBar) findViewById(R.id.sb_volume); sbSoundEffect = (SeekBar) findViewById(R.id.sb_sound_effect); btnSave = (Button) findViewById(R.id.btn_save);
cbVolume.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { if (b) sbVolume.setVisibility(View.VISIBLE); else sbVolume.setVisibility(View.INVISIBLE); } });
cbSoundEffect.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { if (b) sbSoundEffect.setVisibility(View.VISIBLE); else sbSoundEffect.setVisibility(View.INVISIBLE); } });
// Get value from sharedPreferences SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFERENCE_NAME, Context.MODE_PRIVATE); boolean isVolume = sharedPreferences.getBoolean("volume", false); boolean isSoundEffect = sharedPreferences.getBoolean("sound_effect", false); int volumeValue = sharedPreferences.getInt("volume_value", 0); int soundEffectValue = sharedPreferences.getInt("sound_effect_value", 0); cbVolume.setChecked(isVolume); cbSoundEffect.setChecked(isSoundEffect);
if (isVolume) sbVolume.setProgress(volumeValue); else sbVolume.setVisibility(View.INVISIBLE);
if (isSoundEffect) sbSoundEffect.setProgress(soundEffectValue); else sbSoundEffect.setVisibility(View.INVISIBLE);
btnSave.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFERENCE_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putBoolean("volume", cbVolume.isChecked()); editor.putBoolean("sound_effect", cbSoundEffect.isChecked());
if (cbVolume.isChecked()) editor.putInt("volume_value", sbVolume.getProgress()); else editor.putInt("volume_value", 0);
if (cbSoundEffect.isChecked()) editor.putInt("sound_effect_value", sbSoundEffect.getProgress()); else editor.putInt("sound_effect_value", 0);
// Save changes editor.apply(); } }); } }
Khi thay đổi giá trị checkbox và seekbar, sau đó lưu lại và thoát ứng dụng. Vào lại ứng dụng thì thấy rằng phần cài đặt này giống như đã lưu ở trước đó.
Để chắc chắn hơn, mở Android Device Moniter để xem file .xml được lưu ở chỗ nào. Vào
editor.clear(); editor.apply(); // Apply changes
1 →
editor.clear(); editor.apply(); // Apply changes
2 →
editor.clear(); editor.apply(); // Apply changes
3.
Trong mục File Explorer, tìm đến thư mục data/data.
Và tìm đến package
editor.clear(); editor.apply(); // Apply changes
4 sẽ thấy 1 thư mục có tên là shared_prefs chứa file XML đã lưu sử dụng SharedPreferences trong Android.