Menyimpan Data Menggunakan Object 'SharedPreferences'

Android menyediakan object SharedPreferences untuk membantu kita menyimpan data. Misalnya, app kita mungkin menyediakan pilihan untuk memungkinkan user menentukan ukuran font dari teks yang ditampilkan. Untuk hal seperti ini app kita perlu mengingat ukuran yang di-set oleh user sehingga berikutnya user akan menggunakan setting ukuran font terakhir. Untuk melakukan hal seperti ini kita memiliki beberapa pilihan. Kita bisa menyimpan data tersebut ke file, tetapi kita akan harus melakukan beberapa hal untuk menajemen file, misalnya menulis data file yang berarti akan menghitung berapa karakter yang akan dibaca, dst. Selain itu, bila kita juga beberapa hal lain untuk disimpan misalnya ukuran teks, nama font, warna background, dst, maka pekerjaan menulis ke file menjadi berat.

Sebagai alternatif untuk menulis ke file adalah dengan menggunakan database, tetapi menyimpan data sederhana ke database merupakan hal yang sangat berlebihan baik dari sisi sudut pandang developer maupun kinerja app saat run-time.

Dengan menggunakan object 'SharedPreferences' kita bisa menyimpan data semacam itu dengan cara menggunakan pasangan 'nama-dan-valuenya', yaitu kita menentukan nama untuk data yang akan disimpan dan kemudian baik nama maupun value-nya akan disimpan secara otomatis di suatu file XML.

Berikut kode untuk latihan menyimpan data dengan menggunakan object 'SharedPreferences':

File layout xml: activity_main.xml:
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    > 
    <SeekBar
        android:id="@+id/SeekBar01"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" /> 
    <TextView
        android:id="@+id/TextView01"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" /> 
    <EditText
        android:id="@+id/EditText01"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" /> 
    <Button
        android:id="@+id/btnSave"
        android:text="Save"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" /> 
</LinearLayout>

File java: MainActivity.java
package com.example.mysharedpreferences; 
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.SeekBar;
import android.widget.Toast; 
public class MainActivity extends AppCompatActivity {
    private SharedPreferences prefs;
    private String prefName = "MyPref";
    private EditText editText;
    private SeekBar seekBar;
    private Button btn;
    private static final String FONT_SIZE_KEY = "fontsize";
    private static final String TEXT_VALUE_KEY = "textvalue"; 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); 
        editText = (EditText) findViewById(R.id.EditText01);
        seekBar = (SeekBar) findViewById(R.id.SeekBar01);
        btn = (Button) findViewById(R.id.btnSave); 
        btn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) { 
                //---get the SharedPreferences object---
                //prefs = getSharedPreferences(prefName, MODE_PRIVATE);
                prefs = getPreferences(MODE_PRIVATE);
                SharedPreferences.Editor editor = prefs.edit(); 
                //---save the values in the EditText view to preferences---
                editor.putFloat(FONT_SIZE_KEY, editText.getTextSize());
                editor.putString(TEXT_VALUE_KEY, editText.getText().toString()); 
                //---saves the values---
                editor.apply(); 
                //---display file saved message---
                Toast.makeText(getBaseContext(),
                        "Font size saved successfully!",
                        Toast.LENGTH_SHORT).show();
            }
        }); 
        //---load the SharedPreferences object---
        //SharedPreferences prefs = getSharedPreferences(prefName, MODE_PRIVATE);
        prefs = getPreferences(MODE_PRIVATE); 
        //---set the TextView font size to the previously saved values---
        float fontSize = prefs.getFloat(FONT_SIZE_KEY, 12); 
        //---init the SeekBar and EditText---
        seekBar.setProgress((int) fontSize);
        editText.setText(prefs.getString(TEXT_VALUE_KEY, ""));
        editText.setTextSize(seekBar.getProgress()); 
        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
            }
            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
            }
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress,
                                          boolean fromUser) { 
                //---change the font size of the EditText---
                editText.setTextSize(progress);
            }
        });
    }
}

Jalankan di Android Studio dan hasilnya seperti di bawah ini:

Menyimpan data dengan menggunakan
object 'SharedPreferences'
Data tersebut juga bisa dilihat menggunakan DDMS di Android Studio seperti gambar di bawah ini:
Data object 'SharedPreferences' disimpan dalam bentuk file xml

Penjelasan:
Kita menggunakan method 'getSharedPreferences()' untuk mendapatkan instans class 'SharedPreferences'. Kemudian kita membuat object 'SharedPreference.Editor' dengan menggunakan method 'edit()' dari object 'SharedPreferences'. Untuk mengubah nilai ukuran font kita gunakan method 'putFloat()' dan method 'putString()' untuk mengubah nilai string. Kemudian untuk menyimpan perubahannya kita gunakan method 'apply()'.

Catatan:
'getSharedPreferences()' dan 'getPreferences()' sama saja apabila hanya ada satu shared preference file. Karena hanya satu shared preference file, apabila kita menggunakan 'getPreferences()' tidak perlu menyebut nama atau key-nya. Untuk lebih jelas bisa dibaca lagi tentang: Menyimpan Pasangan Key-dan-Value.

No comments: