Header ads

Header ads
» » Shared preferences

Shared Preferences trong Android

Shared Preferences là đối tượng Android cung cấp cho việc lưu trữ và truy xuất các dữ liệu có kiểu cơ bản như Boolean, string, float, long, and integer trong lập trình các ứng dụng đơn giản. 
Ví dụ như ứng dụng của bạn cho phép người dùng cài đặt các tùy chọn liên quan đến màu chữ hay màu nền của các màn hình. Trong trường hợp này, bạn có thể sử dụng đối tượng Shared Preferences để lưu lại các thông tin tùy chọn người dùng thiết lập theo từng cặp key/value và truy xuất sử dụng cho mỗi lần mở lại ứng dụng.

Shared Preference sẽ được lưu lại thông qua việc sử dụng chỉ định khóa cho từng giá trị dữ liệu (theo từng cặp key/value), những giá trị key.value này sẽ được tự động ghi vào một tập tin XML được chứa bên trong thư mục của ứng dụng. Những cặp giá trị này sẽ tồn tại và sẵn sàng cho việc sự dụng (đọc và cập nhật) trong suốt phiên làm việc của ứng dụng và được chia sẻ bên trong các thành phần cúa ứng dụng (như activity, service,…). Các giá trị shared preference này không thể truy xuất và sử dụng từ những ứng dụng khác.

Dữ liệu của ứng dụng được lưu trữ trong thư mục data/data/ Tên package của ứng dụng. Ví dụ: data/data/com.hiepsiit.com. Do đó,trong một Context tại phiên làm việc hiện tại của ứng dụng, bạn có thể truy xuất đối tượng lớp Shared Preferences thông qua hàm getSharedPreferences(Sttring name, int mode).


Có 2 cách lưu trữ dữ liệu trong Shared Preference

Cách 1:  Sử dụng Activity Preferences:

  • Chúng ta phải gọi getPreferences (int mode) có trong lớp Activity.
  • Chỉ sử dụng khi  preference file là cần thiết trong Activity
  • Nó không yêu cầu tên vì nó sẽ là tập tin ưu tiên duy nhất cho Activity.
  • Lập trình viên thường không thích sử dụng tính năng này ngay cả khi họ chỉ cần một tệp tùy chọn trong Activity. Họ thích sử dụng phương thức tùy biến getSharedPreferences (tên String, chế độ int).

Cách 2: Sử dụng Custom Preferences: 

  • Sử dụng phương thức getSharedPreferences(String name,int mode) cho Custom Preferences
  • Được sử dụng trong các trường hợp khi yêu cầu nhiều tập tin tùy Preferences trong Activity
  • Tên của tập tin preference  được truyền cho tham số đầu tiên

Mode (chế độ) và kiểu trong Shared Preference:

Để tạo Activity dựa vào preferences hoặc custom preferences phải truyền chế độ (mode) để cho hệ thống biết về quyền riêng tư của tập tin preference.

Context là gì?

Context là một lớp trừu tượng được sử dụng để lấy thông tin toàn cục trong các tài nguyên trong ứng dụng Android strings, values, drawables, assets v.v

Có 3 loại Mode trong Shared Preference:

  1. Context.MODE_PRIVATE – Giá trị mặc định (Không chấp nhận ứng dụng từ bên ngoài)

  2. Context.MODE_WORLD_READABLE – Có thể đọc từ ứng dụng khác

  3. Context.MODE_WORLD_WRITEABLE – Đọc/Ghi từ ứng dụng khác

1. MODE_PRIVATE Đây là chế độ mặc định. MODE_PRIVATE được sử dụng để thiết lập chế độ riêng tư, không chấp nhận ứng dụng từ bên ngoài.
2. MODE_WORLD_READABLE – mode điều khiển cho phép đọc  tập tin Preferences từ ứng dụng khác.
3. MODE_WORLD_WRITEABLE – mode điều khiển cho phép chỉnh sửa tập tin Preferences từ ứng dụng khác.


Các bước lưu dữ liệu trong Shared Preference

Bước 1: Để lưu dữ liệu trong SharedPreferences chúng ta cần gọi phương thức của lớp SharedPreferences. Lớp SharedPreferences trả về một đối tượng Editor .

Bước 2: Lớp Editor và sử dụng các phương thức put<type> để thêm mới (nếu chưa có) hoặc cập nhật giá trị cho các từ khóa (key) được chỉ định như đoạn code bên dưới.

  SharedPreferences.Editor editor = mySharedPreferences.edit();  // Store new primitive types in the shared preferences object.  editor.putBoolean("isTrue", true);  editor.putFloat("floatValue", 1f);  editor.putInt("intValue", 2);  editor.putLong("longValue", 3l);  editor.putString("stringValue", "Not Empty");

Bước 3: Sử dụng phương thức Commit() để gọi đồng bộ và trả về kết quả lưu thành công hay không hoặc sử dụng phương thức Apply() nếu chúng ta không quan tâm đến kết quả trả về


Các bước đọc và lấy dữ liệu trong Shared Preference

Bước 1:
Để đọc dữ liệu  reference từ đối tượng SharedPreferences chúng ta sử dụng phương thức getPreferences (int mode) hoặc getSharedPreferences (String name,int mode).
Bước 2:  Chúng ta sẽ truy xuất lại các giá trị đã lưu bằng cách dùng các phương thức an toàn (gọi là type-safe) SharedPreferences.get<type> với 2 thông số: thông số đầu là key để lấy dữ liệu, và thông số thứ hai là giá trị mặc định (trong trường hợp key đó chưa được lưu trước đó).

  // Retrieve the saved values.  boolean isTrue = mySharedPreferences.getBoolean("isTrue", false);  float lastFloat = mySharedPreferences.getFloat("floatValue", 0f);  int wholeNumber = mySharedPreferences.getInt("intValue", 1);  long aNumber = mySharedPreferences.getLong("longValue", 0);  String stringPreference = mySharedPreferences.getString("stringValue", "");

Xóa dữ liệu hoặc xóa tất cả dữ liệu
Sử dụng phương thức  remove(String key) trong SharedPreferences.Editor để xóa. Để xóa tất cả dữ liệu chúng ta gọi phương thức clear(). Sau đó gọi commit() để lưu dữ liệu.


Ví dụ lưu và đọc dữ liệu

  public static final String PREFS_GAME ="com.hiepsiit.hiepsiit.GamePlay";  public static final String GAME_SCORE= "GameScore";    //======== Code to save data ===================    SharedPreferences sp = getSharedPreferences(PREFS_GAME ,Context.MODE_PRIVATE);  sp.edit().putInt(GAME_SCORE,100).commit();    //========= Code to get saved/ retrieve data ==============    SharedPreferences sp = getSharedPreferences(PREFS_GAME ,Context.MODE_PRIVATE);  int sc  = sp.getInt(GAME_SCORE,0);  Log.d("hiepsiit","achieved score  is "+ sc);

Ví dụ: Trong ví dụ này chúng ta sẽ làm ứng dụng để lưu trữ Email và Password để thiết bị.  Tiến hành tạo project, vào thư mục  res /layout -> activity_main.xml  thiết kế giao diện sau:

Bước 1: Tạo một project tên là SharedPreferenceFile->New->Android Application Project điền các thông tin ->Next ->Finish

Bước 2: Mở res -> layout -> xml (hoặc) activity_main.xml và thêm code trong Relaytive Layout.

  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:tools="http://schemas.android.com/tools"      android:layout_width="match_parent"      android:layout_height="match_parent"      android:paddingBottom="@dimen/activity_vertical_margin"      android:paddingLeft="@dimen/activity_horizontal_margin"      android:paddingRight="@dimen/activity_horizontal_margin"      android:paddingTop="@dimen/activity_vertical_margin"      tools:context="hiepsiit.com.sharedpreference.MainActivity" >       <!-- Login progress -->      <ProgressBar          android:id="@+id/login_progress"          style="?android:attr/progressBarStyleLarge"          android:layout_width="wrap_content"          android:layout_height="wrap_content"          android:layout_marginBottom="8dp"          android:visibility="gone"/>        <ScrollView          android:id="@+id/login_form"          android:layout_width="match_parent"          android:layout_height="match_parent">            <LinearLayout              android:id="@+id/email_login_form"              android:layout_width="match_parent"              android:layout_height="wrap_content"              android:orientation="vertical">                              <EditText                      android:id="@+id/email"                      android:layout_width="match_parent"                      android:layout_height="wrap_content"                      android:hint="Nhập email"                      android:inputType="textEmailAddress"                      android:maxLines="1"                      android:singleLine="true"/>                                 <EditText                      android:id="@+id/password"                      android:layout_width="match_parent"                      android:layout_height="wrap_content"                      android:hint="Nhập mật khẩu"                      android:imeActionId="@+id/login"                      android:imeOptions="actionUnspecified"                      android:inputType="textPassword"                      android:maxLines="1"                      android:singleLine="true"/>                             <CheckBox                  android:layout_width="match_parent"                  android:layout_height="wrap_content"                  android:text="Remember Me"                  android:id="@+id/checkBoxRememberMe"/>                <Button                  android:id="@+id/email_sign_in_button"                  style="?android:textAppearanceSmall"                  android:layout_width="match_parent"                  android:layout_height="wrap_content"                  android:layout_marginTop="16dp"                  android:text="Đăng nhập"                  android:textStyle="bold"/>            </LinearLayout>      </ScrollView>    </RelativeLayout>  

Bước 3: Trong tập tin strings.xml chúng ta định nghĩa các biến thông báo lỗi.

  <?xml version="1.0" encoding="utf-8"?>  <resources>        <string name="app_name">SharedPreference</string>      <string name="hello_world">Hello world!</string>      <string name="action_settings">Settings</string>      <string name="title_activity_home">HomeActivity</string>      <string name="error_field_required">Email không được rỗng</string>  	<string name="error_invalid_email">Email không đúng định dạng</string>  	<string name="error_invalid_password">Mật khẩu phải lớn hơn 4 ký tự</string>  </resources>  

Bước 4: Xây dựng phương thức attemptLogin(). Trong bước này chúng ta kiểm tra email và password có hợp lệ? Nếu hợp lệ và người sử dụng chọn vào checkbox "Remeber me"  và click vào đăng nhập sẽ lưu thông tin đăng nhập vào tập tin LoginDetails.XML đồng thời mở một Activity mới
 

   private void attemptLogin() {            // Reset errors.          mEmailView.setError(null);          mPasswordView.setError(null);            // Store values at the time of the login attempt.          String email = mEmailView.getText().toString();          String password = mPasswordView.getText().toString();            boolean cancel = false;          View focusView = null;            // Check for a valid password, if the user entered one.          if (!TextUtils.isEmpty(password) && !isPasswordValid(password)) {              mPasswordView.setError(getString(R.string.error_invalid_password));              focusView = mPasswordView;              cancel = true;          }            // Check for a valid email address.          if (TextUtils.isEmpty(email)) {              mEmailView.setError(getString(R.string.error_field_required));              focusView = mEmailView;              cancel = true;          } else if (!isEmailValid(email)) {              mEmailView.setError(getString(R.string.error_invalid_email));              focusView = mEmailView;              cancel = true;          }            if (cancel) {              // There was an error; don't attempt login and focus the first              // form field with an error.              focusView.requestFocus();          } else {              // save data in local shared preferences              if (checkBoxRememberMe.isChecked())                  saveLoginDetails(email, password);              startHomeActivity();          }  }

Toàn bộ code MainActivity.java

  package hiepsiit.com.sharedpreference;    import android.app.Activity;  import android.content.Intent;  import android.os.Bundle;  import android.text.TextUtils;  import android.view.KeyEvent;  import android.view.Menu;  import android.view.MenuItem;  import android.view.View;  import android.view.View.OnClickListener;  import android.view.inputmethod.EditorInfo;  import android.widget.Button;  import android.widget.CheckBox;  import android.widget.EditText;  import android.widget.TextView;    public class MainActivity extends Activity {  	 // UI references.      private EditText mEmailView;      private EditText mPasswordView;        private CheckBox checkBoxRememberMe;    	@Override  	protected void onCreate(Bundle savedInstanceState) {  		super.onCreate(savedInstanceState);  		setContentView(R.layout.activity_main);  		mEmailView = (EditText) findViewById(R.id.email);          mPasswordView = (EditText) findViewById(R.id.password);          mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() {              @Override              public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) {                  if (id == R.id.login || id == EditorInfo.IME_NULL) {                      attemptLogin();                      return true;                  }                  return false;              }    			          });            Button mEmailSignInButton = (Button) findViewById(R.id.email_sign_in_button);          mEmailSignInButton.setOnClickListener(new OnClickListener() {              @Override              public void onClick(View view) {                  attemptLogin();              }          });            checkBoxRememberMe = (CheckBox) findViewById(R.id.checkBoxRememberMe);          //Here we will validate saved preferences          if (!new PrefManager(this).isUserLogedOut()) {              //user's email and password both are saved in preferences              startHomeActivity();          }    	}  	 /**       * Attempts to sign in or register the account specified by the login form.       * If there are form errors (invalid email, missing fields, etc.), the       * errors are presented and no actual login attempt is made.       */      private void attemptLogin() {            // Reset errors.          mEmailView.setError(null);          mPasswordView.setError(null);            // Store values at the time of the login attempt.          String email = mEmailView.getText().toString();          String password = mPasswordView.getText().toString();            boolean cancel = false;          View focusView = null;            // Check for a valid password, if the user entered one.          if (!TextUtils.isEmpty(password) && !isPasswordValid(password)) {              mPasswordView.setError(getString(R.string.error_invalid_password));              focusView = mPasswordView;              cancel = true;          }            // Check for a valid email address.          if (TextUtils.isEmpty(email)) {              mEmailView.setError(getString(R.string.error_field_required));              focusView = mEmailView;              cancel = true;          } else if (!isEmailValid(email)) {              mEmailView.setError(getString(R.string.error_invalid_email));              focusView = mEmailView;              cancel = true;          }            if (cancel) {              // There was an error; don't attempt login and focus the first              // form field with an error.              focusView.requestFocus();          } else {              // save data in local shared preferences              if (checkBoxRememberMe.isChecked())                  saveLoginDetails(email, password);              startHomeActivity();          }      }        private void startHomeActivity() {          Intent intent = new Intent(this, HomeActivity.class);          startActivity(intent);          finish();      }        private void saveLoginDetails(String email, String password) {          new PrefManager(this).saveLoginDetails(email, password);      }          private boolean isEmailValid(String email) {          //TODO: Replace this with your own logic          return email.contains("@");      }        private boolean isPasswordValid(String password) {          //TODO: Replace this with your own logic          return password.length() > 4;      }  }  

Bước 5: Tạo một lớp java tên PrefManager.java, thêm code sau:

  package hiepsiit.com.sharedpreference;    import android.content.Context;  import android.content.SharedPreferences;    public class PrefManager {  	  	Context context;        PrefManager(Context context) {          this.context = context;      }        public void saveLoginDetails(String email, String password) {          SharedPreferences sharedPreferences = context.getSharedPreferences("LoginDetails", Context.MODE_PRIVATE);          SharedPreferences.Editor editor = sharedPreferences.edit();          editor.putString("Email", email);          editor.putString("Password", password);          editor.commit();      }        public String getEmail() {          SharedPreferences sharedPreferences = context.getSharedPreferences("LoginDetails", Context.MODE_PRIVATE);          return sharedPreferences.getString("Email", "");      }        public boolean isUserLogedOut() {          SharedPreferences sharedPreferences = context.getSharedPreferences("LoginDetails", Context.MODE_PRIVATE);          boolean isEmailEmpty = sharedPreferences.getString("Email", "").isEmpty();          boolean isPasswordEmpty = sharedPreferences.getString("Password", "").isEmpty();        		          return isEmailEmpty || isPasswordEmpty;      }  }  

Bước 6: Tạo thêm Activity mới tên là HomeActivity, thêm code vào tập tin activity_home.xml:

  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:tools="http://schemas.android.com/tools"      android:layout_width="match_parent"      android:layout_height="match_parent"      android:paddingBottom="@dimen/activity_vertical_margin"      android:paddingLeft="@dimen/activity_horizontal_margin"      android:paddingRight="@dimen/activity_horizontal_margin"      android:paddingTop="@dimen/activity_vertical_margin"      tools:context="hiepsiit.com.sharedpreference.HomeActivity" >   <TextView          android:id="@+id/textViewUser"          android:layout_width="wrap_content"          android:layout_height="wrap_content"          android:layout_centerInParent="true"          android:gravity="center"          android:text="Welcome"/>    </RelativeLayout>  

Download ví dụ

Ứng dụng này được phát triển bởi adt bundleandroid 4.2 sử dụng minimum sdk 9 and target sdk 21.


Kết quả khi chạy ứng dụng:

Nhập thông tin sai sẽ báo lỗi sau:

Nhập đúng thông tin sau đó clik vào nút "Đăng nhập":

Sau đó mở ra một Activity mới:


 


Xem tập tin được lưu trữ trong Shared Preference:

Chọn Window-> Show View -> Other

Sau đó, tìm File Explore ->OK

Chọn File Explore


 


 



Cập nhật công nghệ từ Youtube tại link: https://www.youtube.com/channel/UCOxeYcvZPGf-mGLYSl_1LuA/videos
Để tham gia khóa học công nghệ truy cập link: http://thuvien.hocviendaotao.com
Mọi hỗ trợ về công nghệ email: dinhanhtuan68@gmail.com

About Học viện đào tạo trực tuyến

Xinh chào bạn. Tôi là Đinh Anh Tuấn - Thạc sĩ CNTT. Email: dinhanhtuan68@gmail.com .
- Nhận đào tạo trực tuyến lập trình dành cho nhà quản lý, kế toán bằng Foxpro, Access 2010, Excel, Macro Excel, Macro Word, chứng chỉ MOS cao cấp, IC3, tiếng anh, phần mềm, phần cứng .
- Nhận thiết kế phần mềm quản lý, Web, Web ứng dụng, quản lý, bán hàng,... Nhận Thiết kế bài giảng điện tử, số hóa tài liệu...
HỌC VIỆN ĐÀO TẠO TRỰC TUYẾN:TẬN TÂM-CHẤT LƯỢNG.
«
Next
Bài đăng Mới hơn
»
Previous
Bài đăng Cũ hơn