เซฟข้อมูลด้วย SharedPreferences
เวลาเราเขียนแอพพลิเคชัน จะต้องมีการเก็บข้อมูลต่างๆของแอพพลิเคชันอยู่แล้ว ซึ่งแอพพลิเคชันแอนดรอยส์ สามารถบันทึกข้อมูลต่างๆได้ หลากหลายวิธี ทั้ง การอ่านเขียน ข้อมูลลงไปในไฟล์ , การเซฟข้อมูลโดยใช้ SQLite และการเซฟข้อมูลโดยใช้ SharedPreferences ซึ่งในบทความนี้จะมาพูดถึงเจ้า SharedPreferences กันครับ
SharedPreferences คืออะไร?
SharedPreferences คือ คลาสที่ทาง Android มีมาให้เพื่อให้เราสามารถเซฟและอ่านข้อมูลได้นั่นเอง โดยข้อมูลจะเก็บเป็นแบบ key-value สามารถใช้ SharedPreferences เก็บข้อมูลลงไปได้ ทั้ง boolean, float, int, long หรือแม้แต่ String ข้อมูลที่เซฟด้วย SharedPreferences จะอยู่แม้ว่าเราจะปิดแอพแล้วก็ตาม แต่ข้อมูลจะหายไป หากเราทำการ uninstall แอพพลิเคชันของเรานะครับ
เมื่อไหร่ที่ควรใช้ SharedPreferences
การใช้ SharedPreferences ควรเป็นการใช้งานแบบง่ายๆ ข้อมูลไม่ซับซ้อนมากนัก โดยที่เห็นทั่วๆไปและนิยมนำ SharedPreferences มาใช้ก็ เช่น
เช็คว่าใช้ แอพพลิเคชั่นครั้งแรกหรือไม่? : หลายๆแอพนิยมใช้เพื่อเช็คว่า เป็นครั้งแรกที่ยูเซอร์ใช้แอพนี้หรือโหลดแอพนี้เป็นครั้งแรกหรือไม่ หากใช่ ก็จะทำการโหลดหน้า Tutorial หรือหน้า guideline ต่างๆขึ้นมา
เช็คว่าแอพอัพเดทล่าสุดหรือยัง : เช่นบางแอพจะมีโหมด caching หรือ sync ข้อมูลต่างๆ ก็จะใช้ sharedpreferences เก็บข้อมูลเวลาล่าสุดไว้
เก็บค่า Location : อ่านจะมีบางแอพที่ใช้เก็บ caching พวก ตำแหน่ง Location ของยูเซอร์ เช่น ตำแหน่งล่าสุดของยูเซอร์นั้นๆ กรณีบางที เราไม่ได้เปิด GPS เช่นอาจจะเก็บ Latitude, Longitude ไว้
ใช้เซฟ Session ต่างๆ : อันนี้ไว้สำหรับเซฟพวก Session ต่างๆ หรือว่ารายละเอียดของยูเซอร์ที่ทำการล็อคอิน เช่น ชื่อ อีเมล์ต่างๆ เวลาล็อคเอาท์ ก็ทำการลบข้อมูลทิ้ง เป็นต้น
เก็บค่า Settings ของโปรแกรม : อันนี้น่าจะนิยมสุด คือใช้เก็บการตั้งค่าของโปรแกรม เช่น การเลือกภาษา การเลือกฟ้อน ขนาด รูปแบบต่างๆของโปรแกรม หรือการตั้งค่าอื่นๆ ของแอพพลิเคชัน
ตัวอย่างการใช้ SharedPreferences
public class SharedPreferencesDemo extends Activity {
private static final String MY_PREFS = "my_prefs";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Get SharedPreferences
SharedPreferences shared = getSharedPreferences(MY_PREFS,
Context.MODE_PRIVATE);
// หรือ
SharedPreferences shared2 = getApplicationContext().getSharedPreferences(MY_PREFS,
Context.MODE_PRIVATE);
// Save SharedPreferences
Editor editor = shared.edit();
editor.putString("stringKey", "This is a book!");
editor.putBoolean("booleanKey", true);
editor.commit();
String stringValue = shared.getString("stringKey", "not found!");
boolean booleanValue = shared.getBoolean("booleanKey, false);
Log.i("LOG_TAG", "String value: " + stringValue);
Log.i("LOG_TAG ", "Boolean value: " + booleanValue);
}
}
มาดูที่โค๊ดด้านบน เริ่มแรก ผมได้ทำการ extends Activity
ในเมธอด onCreate()
ก็ได้ใช้ getSharedPreferences(String name, int mode)
เพื่อเข้าถึงข้อมูลที่เซฟไว้ครับ โดย argument ตัวแรก คือ ชื่อที่เราตั้ง my_prefs
และอีก argument คือ mode การเซฟครับ โดยโหมดแต่ละโหมดมีดังนี้
- MODE_PRIVATE มีค่าเท่ากับ 0 : หากตั้งค่าเป็นโหมดนี้ จะทำให้เราสามารถเข้าถึงข้อมูลได้เฉพาะแอพพลิเคชันของเรา
- MODE_WORLD_READABLE มีค่าเท่ากับ 1 : หากตั้งโหมดนี้ แอพอื่นๆ สามารถอ่านค่าข้อมูลของเราได้ (ปัจจุบันเป็น @deprecated ไม่แนะนำให้ใช้)
- MODE_WORD_WRITEABLE มีค่าเท่ากับ 2 : หากตั้งโหมดนี้ แอพอื่นๆ สามารถที่เขียนทับข้อมูลของเราได้ (ปัจจุบัน @deprecated ไปแล้ว)
ส่วนที่นิยมใช้ ก็คงจะเป็น MODE_PRIVATE
นั่นแหละครับ เพราะไม่มีความจำเป็นที่จะต้องให้แอพพลิเคชันอื่นๆเรียกใช้งานด้วย ไม่อย่างงั้นไปใช้พวก ContentProvider ดูจะเหมาะสมและตรงจุดประสงค์กว่า
เมื่อเราเรียก getSharedPreferences
แล้วจะได้ข้อมูล my_prefs
ของเราที่เก็บเป็น format xml จะอยู่ใน /data/data/com.your.package/shared_prefs/my_prefs.xml
ฟอแมตจะได้ประมาณนี้
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="stringKey" value="This is a book!" />
<boolean name="booleanKey" value="true" />
</map>
การอ่านข้อมูล
การอ่านข้อมูล ของ key ที่เราได้ทำการเซฟลง my_prefs
ของเรา ทำได้โดยใช้ เมธอด get()
เช่น getString()
สำหรับอ่านข้อมูลที่เป็น String , getBoolean()
สำหรับอ่านข้อมูลที่เป็น boolean เป็นต้น เช่น
String stringValue = shared.getString("stringKey", "not found!");
boolean booleanValue = shared.getBoolean("booleanKey, false);
โดยอันแรกคือ ทำการอ่านข้อมูล String ที่เซฟในชื่อ stringKey
หากหาไม่เจอ มันก็จะเซฟเป็น stringKey เป้นค่า not found!
ไว้ เช่นกัน getBoolean หากไม่พบคีย์ มันก็จะเซฟค่า default นั่นก็คือ false ลงไป
อ่านเซฟข้อมูล
การเซฟข้อมูล ก็ทำลักษณะเดียวกับการอ่าน คือ มีเมธอด put()
เช่น putString()
สำหรับเซฟข้อมูล String, 'putBoolean()สำหรับข้อมูล boolean เป็นต้น แต่มีข้อแตกต่างคือ เราต้องเข้าสู่โหมด Edit ก่อน และหลังจาก put() เสร็จสิ้นแล้ว ต้องใช้เมธอด
commit()หรือ
apply()เพื่อสั่งให้ข้อมูลทั้งหมดที่ได้ทำการ put นั้นเซฟลง
my_prefs.xml`
Editor editor = shared.edit();
editor.putString("stringKey", "This is a book!");
editor.putBoolean("booleanKey", true);
editor.commit();
apply กับ commit ต่างๆกันที่ apply จะเป้นแบบ asynchronous ส่วน commit เป็นแบบ synchronous คือมีการส่งค่ากลับมาว่าเซฟข้อมูลสำเร็จหรือไม่ เป็น true/false
การลบข้อมูล
การลบข้อมูลของ SharedPreferences ทำได้ทั้งลบข้อมูลคีย์ที่เราสร้างไว้หรือว่าลบทั้งหมดเลย เช่น ลบคีย์ stringKey
Editor editor = shared.edit();
editor.remove(“stringKey");
editor.commit();
หรือลบทั้งหมด
Editor editor = shared.edit();
editor.clear();
editor.commit();
- Authors
- Name
- Chai Phonbopit
- Website
- @Phonbopit