Sharedpreferences là gì

Đây là bài đầu tiên về series lập trình android nâng cao sau khi mình đã hoàn thành xong loạt video căn bản tại blog của mình, mình không biết nên bắt đầu từ đâu cả vì kiến thức nâng cao nó sẽ không theo một quy trình nào cả các bạn.

Tất cả nó không hẳn liên quan tới nhau giống như phần căn bản chính vì thế mình cũng không biết sắp xếp ra làm sao cho hợp lí tuy nhiên mình sẽ cố gắng cung cấp hết những cái cần thiết để các bạn học và đi xin việc sau này.

Bài đầu tiên hôm nay chúng ta sẽ đi tìm hiểu về các cách lưu dữ liệu trên android nhé.

Trong lập trình android thì sẽ có tổng 5 cách để các bạn đọc, viết dữ liệu đó là:

  • Shared Preferences
  • Internal Storage
  • External Storage
  • SQLite Database
  • Network Connection

Chi tiết hơn://developer.android.com/guide/topics/data/data-storage.html

Tổng là 5 cách đó các bạn, tuy nhiên cách thứ 5 thì trong loạt series này mình không hướng dẫn vì nó chẳng có gì cả ngoài chỉ là lưu dữ liệu lên server thôi.

Chúng ta sẽ học hết 4 cách lưu dữ liệu ở trong loạt series này, và bài đầu tiên chúng ta học là đọc và lưu dữ liệu với Shared Preferences, đây là gì và các lưu nó như thế nào thì mình cùng xem qua bài viết này nhé:

Shared Preferences trong android là gì?

Đây là một class Interface cho phép bạn lưu trữ và đọc dữ liệu với bằng các cặp key và value và nó được lưu dưới dạng một file xml, dữ liệu nó có thể lưu là ở dạng nguyên thuỷ như: int, float, string, boolean, long. Dữ liệu của Shared Preferences sẽ được lưu ở trong ứng dụng android luôn chính vì thế nếu các bạn xoá ứng dụng đi hoặc là xoá dữ liệu app thì dữ liệu này sẽ hoàn toàn bị biến mất.

Vậy nhiều người sẽ hỏi Shared Preferences có lưu được Oject không thì câu trả lời là không nhé? Tuy nhiên sẽ có cách để chúng ta lưu đó là chuyển nó qua kiểu String rồi save lại bằng thư viện GSON, và cái này mình sẽ hướng dẫn sau cho các bạn nhé.

Shared Preferences được dùng khi nào?

Một hạn chế của thằng này đó là thường để lưu dữ liệu nhỏ, ít và đơn lẽ thôi.Mình sẽ cho một số ví dụ cho các bạn thấy ngay sau đây:

Bạn chơi Game thì thường sẽ có mục High Score [điểm cao] bạn bao giờ thắc mắc nó lưu ở đâu không? Chính là dùng Shared Prenferenes để lưu trữ đó các bạn, không tin hãy thử xoá dữ liệu của app mà không xoá app thì có bị mất không?

Hoặc là một số ứng dụng khi lần đầu tiên mở chạy bạn sẽ thấy có intro gì đó hướng dẫn sử dụng hay chơi game khi các bạn vào app lần 2 sẽ không thấy nữa.thì nó cũng dùng Shared Prenferences để lưu đó.

Tại sao phải sử dụng Shared Preferences

Bởi vì sẽ có những dữ liệu nhỏ bắt buộc bạn phải lưu nó trong toàn bộ vòng đời của một ứng dụng, bạn không thể lưu điểmHigh Scoremột trò chơi ở database được vì nó quá ít và không cần thiết, bạn không thể lưu ở bộ nhớ trong hay ngoài được vì nó sẽ dễ bị mất mát dữ liệu.

Chính vì thế Shared Prenferences đã ra đời để khắc phục, tuy nhiên đây là ý kiến cá nhân mình thôi nhé. hè hè.

Cách sử dụngShared Preferences

Vậy thì cách sử dụng nó ra sao thì chúng ta cùng đi phân tích các cú pháp sau đây:

1.Cách lưu dữ liệu xuống Shared Prenferences

Bước 1:

Đầu tiên, để lưu dữ liệu xuống thì bạn sẽ khởi tạo một đối tượng [biến] thuộc kiểuShared Preferences, với cú pháp như sau:

1
SharedPreferences sharedPreferences = getSharedPreferences[SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE];

Với:

SHARED_PREFERENCES_NAME: là tên của fileShared Preferences, bạn sẽ lưu xuống thiết bị và nơi lưu file này chính là thư mục:

1
1 data/data/[application package name]/shared_prefs/shared_preferences_name.xml

Ở đâyshared_preferences_name chính là cái tên bạn lưu ở trên nhé các bạn.

Context.MODE_PRIVATE: đây là một chế độ bảo mật dữ liêu trong android, khi bạn để như vậy có nghĩa là bạn chỉ cho ứng dụng hiện tại truy cập vào file Shared Preferences này thôi mà không một ứng dụng nào có quyền truy cập vào được.

Bước 2:

Tạo đối tượng Editer từ biếnsharedPreferences chúng ta đã tạo ở trên, mục đích của thằng này là để chúng ta có thể mở fileshared_preferences_name.xml ra và đưa dữ liệu vào, cú pháp như sau:

1
SharedPreferences.Editor editor = sharedPreferences.edit[];

Vậy sao khi mở được rồi, để đưa dữ liệu vào chúng ta sẽ làm viết như sau:

editor.putX[String key,value], trong đó:

X: là kiểu dữ liệu bạn đưa vào, với SharedPreferences bạn có thể lưu ở nhưng kiểu dữ liệu như : float, string, int, boolean, long.

key: là tên đặt cho biến bạn sẽ lưu xuống, ví dụ bạn muốn lưu điểm High Score nào đó xuống thì bạn sẽ đặt là high_score chẳng hạn.

value: giá trị bạn sẽ lưu vào biến [là tên củakey ở trên].

Ví dụ chi tiết như sau:

1
2
3
4
5
6
7
SharedPreferences sharedPreferences = getSharedPreferences[SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE];
SharedPreferences.Editor editor = sharedPreferences.edit[];
editor.putBoolean["IS_FIRTS_LAUNCHER",true];
editor.putInt["HIGH_SCORE",100];
editor.putFloat["MARK",9.5f];
editor.putLong["DOWNLOAD_PROGRESS",90];
editor.putString["NAME","THANGCODER.COM"];

Sau khi đã put dữ liệu xong thì bạn sẽ gọi hàm commit[] hoặc là apply[] để xác nhận những thay đổi, thì khi bạn gọi 2 phương thức này thì nó mới lưu xuống được ổ đĩa nhé, ở đây là cái đường dẫn mình đã ghi ở trên.

Vậy sự khác nhau giữa commit[]apply[] là gì bởi vì cả 2 để dùng để xác nhận lưu thay đổi mà,thì mình cùng đi phân tích thử:

commit[] : hoạt động theo cơ chế đồng bộSynchronous,nếu như bạn khởi tạo 2 editor để chỉnh sữa dữ liệu HIGH_SCORE thì editor nào thực hiện trước sẽ làm trước và thằng nào đến sau sẽ làm sau, vì vậy cái commit[] được gọi cuối cùng sẽ là cái thắng.Và bạn sẽ được thông báo là true hay false nếu như thành công hoặc thất bại.

apply[]: hoạt động theo cơ chế không đồng bộAsynchronous,và dù có thành công hay không thì bạn sẽ không nhận được kết quả trả về.

Theo mọi người bảo thì apply[] được thêm vào do không ai để ý đến kết quả trả về và nó nhanh hơn do không đồng bộ.

Ví dụ đơn giản như sau bạn sẽ hiểu:

Nếu bạn có 2 Editor để chỉnh sửa thuộc tính IS_FIRTS_LAUNCHER và HIGH_SCORE, 2 Editor này xử dụng phương pháp apply[] để lưu thay đổi thì nó sẽ đồng thời chỉnh sửa 2 thuộc tính đó và lưu lại mất khoảng thời gian 100 milisecond .Tuy nhiên nếu bạn dùng commit[], thì là vì đồng bộ nên Editor 1 sẽ vào chỉnh sửa IS_FIRTS_LAUNCHER sao đó 100 milisecondthì Editor 2 nhảy vào chỉnh sửa HIGH_SCORE, lúc này tổng 2 quá trình cộng lại sẽ tốn khá nhiều thời gian hơn.

Vậy sau khi đã commit hay apply thì bây giờ dữ liệu bạn sẽ được lưu dưới thư mục data mình đã ghi ở trên, cái này mình nói chi tiết trong video nhé.Đây là kết quả sau khi gọi editor.commit[] hoặc editor.apply[].

1
2
3
4
5
6
7
THANGCODER.COM

2.Các lấy dữ liệu từ Shared Prenferences

Vậy sau khi đã lưu rồi thì lấy ra như thế nào nhỉ? Khá là đơn giản luôn, tương tự như lưu dữ liệu bạn dùng put để đưa vào thì lấy ra bạn dùng get thôi, cái này y chang việc truyền dữ liệu giữa các activity với nhau chúng ta đã học qua ấy nhỉ?

Đây là cách chúng ta lấy ra tất cả các dữ liệu mà ở trên mình đã lưu nhé:

1
2
3
4
5
6
SharedPreferences sharedPreferences = getSharedPreferences[SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE];
boolean isFirtsLauncher = sharedPreferences.getBoolean["IS_FIRTS_LAUNCHER",true];
int highScore = sharedPreferences.getInt["HIGH_SCORE",0];
float mark = sharedPreferences.getFloat["MARK",0.0f];
long downloadProgress = sharedPreferences.getLong["DOWNLOAD_PROGRESS",0];
String name = sharedPreferences.getString["NAME",""];

Bạn sẽ không dùng Editer nữa mà chỉ cần khởi tạo đối tượngSharedPreferences rồi sau đó get ra các giá trị như trên thôi, cụ thể:

sharedPreferences.getBoolean[String key, defValue] :

key: thì tương tự như trên mình đã nói rồi.

defValue: đây là giá trị mặc định mà nó sẽ lấy ra trong trường hợp bạn chưa lưu dữ liệu vào Shares Prenferences, ví dụ như bạn chưa lưu HIGH_SCORE xuống thì làm sao nó lấy lên được, để phòng trường hợp này bạn sẽ truyền giá trị mặc định cho nó là defValue.

3.Các xoá dữ liệu đã lưu xuống Shared Preferences

Mọi thứ liên quan đến chỉnh sửa: edit, update, remove thì bạn phải dùng editor nhé, và ở đây nếu bạn muốn xoá đi dữ liệu nào đó đã lưu trong Shared Preferences thì chỉ cần gọi lênh:

1
editor.remove[String key];

key: chính là tên đối tượng bạn đã lưu xuống, mình đã giải thích ở trên, nhớ sau đó phải gọi hàm editor.apply[] hoặc commit[] nhé.

Và trước hợp bạn muốn xoá đi hết tất cả giá trị đã lưu thì bạn dùng cú pháp:

1
editor.clear[];

Và cũng lại gọi editor.apply[] hoặc commit[] để lưu thay đổi.

Cụ thể hơn bạn sẽ xem video hướng dẫn chi tiết của mình dưới đây nhé.

Video liên quan

Chủ Đề