เซฟข้อมูลด้วย SharedPreferences

Published on
Android
2014/04/android-shared-preferences-tutorial
Discord

เวลาเราเขียนแอพพลิเคชัน จะต้องมีการเก็บข้อมูลต่างๆของแอพพลิเคชันอยู่แล้ว ซึ่งแอพพลิเคชันแอนดรอยส์ สามารถบันทึกข้อมูลต่างๆได้ หลากหลายวิธี ทั้ง การอ่านเขียน ข้อมูลลงไปในไฟล์ , การเซฟข้อมูลโดยใช้ 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();
Buy Me A Coffee
Authors
Discord