Android SharedPreferences Kullanımı

Android’te 5 farklı veri saklama yolu vardır. Bunlardan biri Shared Preferences’tir.

Öncelikle buna neden ihtiyaç duyduğumuzu açıklayalım.

Biliyorsunuz ki bazen uygulamalarımızda verileri saklamak isteriz fakat bu verileri değişkenlerde saklayamayız çünkü uygulamayı kapattığımız anda o verilerde silinmekte. Tabii ki akıllara hemen ikinci seçenek olan veritabanı oluşturup verileri orada tutmak geliyor.

Sqlite ile bir veri tabanı oluşturmak. Ancak bu yöntem küçük verilerin saklanması için oldukça zahmetlidir.

Küçük verilerin saklanması için bir veri tabanı ne kadar uygun değilse büyük verilerin saklanması için de SharedPreferences kullanmak o kadar uygun değildir.Shared preferences ile önemli verileri saklamamalısınız. Bunun yerine önemi fazla olmayan verileri saklamanız uygulamanın sağlığı açısından çok daha iyi olacaktır.

İşte böyle durumlarda Key-value mantığı ile çalışan Shared Preferences imdadımıza yetişir ve bize pratiklik kazandırır. Genelde programların ayarlar bölümündeki veriler ve seçenekler bu yol ile kaydedilmektedir.

Nedir bu SharedPreferences?

Sharedpreferences üstte anlattığım durumundan bizi kurtarmak için tasarlanmış bir Sınıf. Bu sınıf bize çeşitli kullanıcı ayarlarını veya en yüksek skor vb  değerleri saklamakullanma ya da gerektiğinde değiştirebilme gibi imkanlar sağlıyor. Üstelik programı kapatsak bile sakladığımız veriler kaybolmuyor.

SharedPreferences HashMap yani key-value ( anahtar-değer) şeklinde çalışan bir yapısı vardır. Çalışma şekli verileri bir xml dosyası içine kaydeder ve biz bir değer istediğimiz zaman bu xml dosyasından okuyarak bize getirir.

Peki Bu Veriler Nerede ve Nasıl Saklanıyor?

SharedPreferences ile oluşturduğumuz veriler kullandığımız android cihazımızda xml dosyası olarak depolanmakta. Uzantısı tam olarak şöyle, bu yazıda biz Ayarlar olarak tanımladığımız için Ayarlar olarak saklanıyor.:

/data/data/PAKET_ADI/shared_prefs/Ayarlar.xml

SharedPreferences’in içinde String, Int, Boolean, Float, Long tipinde değerler depolanabilir. Uygulama kapansa dahi kaydedilen bu değerler silinmez veya kaybolmaz.

SharedPreference uygulamaya özeldir. Yani izin verilmediği sürece diğer uygulamalar bu içeriğe ulaşamaz.

Kodlamaya geçmeden önce metotlarımızı tanıyalım

setSharedPreference metodu ile istediğimiz veriyi gönderdiğimiz parametreler ile saklayabiliriz.

getSharedPreference daha önce kaydedilen bir veriyi kullanmak istediğimiz zaman kullanırız.

clearSharedPreference metodu ile kaydedilen verilerin temizleme işlemi yapılır.

removeSharedPreference gönderdiğimiz key ile kaydedilen bir verinin kaldırılma işlemi yapılır.

putString String bir veri saklamak için kullanılır. Saklanacak verinin tipine göre değişir.

Yavaş yavaş başlayalım;

Projeye Dahil Etme

import android.content.SharedPreferences;

SharedPreferences Nesnesini Oluşturma

Kütüphanemizi import ettikten sonra bir adet nesne oluşturuyoruz:

SharedPreferences ayarSP= getSharedPreferences("Ayarlar", Context.MODE_PRIVATE);

ayarlar_1 isminde bir nesne oluşturduk. İlk parametrede  verilerin cihazımızda hangi isimle tutulacağını yazıyoruz. Mesela ben Ayarlar kullandık. İkinci değer’e ise Context.MODE_PRIVATE yazıyoruz, bunu yazmamızın sebebi dışarıdan erişilmesini engellemek ve güvenli hale getirmek.

Burada şuna karar vermemiz gerekiyor. Sakladığımız bilgilere sadece bulunduğumuz activity’den mi yoksa uygulamamızdaki herhangi bir aktivity’den mi ulaşağız.

Eğer sadece verilerin kaydedildiği activity’den ulaşacaksak;

SharedPreferences ayarSP= context.getPreferences(context.getPackageName(), Context.MODE_PRIVATE);
SharedPreferences ayarSP= this.getPrefer
ences(Context.MODE_PRIVATE);

Bilgilere uygulamamızdaki herhangi bir activity’den ulaşacaksak;

SharedPreferences ayarSP= context.getSharedPreferences(context.getPackageName(), Context.MODE_PRIVATE);
SharedPreferences ayarSP= getSharedPreferences(Ayarlar,MODE_PRIVATE);

kodlarını kullanarak izin alıyoruz.

Yani getPreferences yerine getSharedPreferences kullanıyoruz ve her bir tercihimize ad konulmuş olmalı.

Kayıt Okumak

SharedPreferences ayarSP= getSharedPreferences(Ayarlar,MODE_PRIVATE);
String adiString = sharedPref.getString("adi","Kayıt Yok");
int noInt = sharedPref.getInt("numara",0);
Boolean kabulBoolean= sharedPref.getBoolean("kabulmu",false);

En üstte oluşturduğumuz ayarlar nesnesini kullanarak ulaşmak istediğiniz değişkenin türünü seçip(getInt), birinci parametreye sakladığımız key’in adını, ikinci parametreye ise eğer öyle bir key yoksa geriye döndüreceği default değeri yazıyoruz.

Kayıt Eklemek

Oluşturduğumuz preference’e bir veri eklemek istiyoruz. Örnek vermek gerekirse numara isminde bir key oluşturup ona bir değer yazmak istiyoruz. Bunun için ilk önce SharedPreferences.Editor kullanmamız gerekiyor, editor’u oluşturalım:

  SharedPreferences.Editor editor = ayarSP.edit(); 

editor oluşturduktan sonra artık ayarSP isimli SharedPreference‘mize veri ekleyebilir/değişebilir/silebiliriz. Şimdi numara key’i oluşturup bir değer girelim 

int girilenNumara= 200;
editor.putInt("numara", girilenNumara);

Gördüğünüz üzere editor nesnesini kullanarak putInt ile birlikte numara key‘ine değerimizi eklemiş olduk. Tabi siz dilerseniz putInt yerine ihtiyacınız olan başka birşey de kullanabilirsiniz. Boolean değer tutacaksanız putBooleanString tutacaksanız putString kullanabilirsiniz. Son olarak yaptığımız bu değeri kaydetmek kaldı. Bunun için de yazdığımız kodun altına şunu ekliyoruz:

editor.commit();

kodları toparlarsak, değer okuma işlemi;

SharedPreferences ayarSP= getSharedPreferences(Ayarlar,MODE_PRIVATE);
  SharedPreferences.Editor editor = ayarSP.edit(); 
  int girilenNumara= 200;
  String adi= "nurullah";
  Boolean onay= true;
  editor.putInt("numara",girilenNumara); //int değer ekleniyor
  editor.putString("adi",adi); //string değer ekleniyor
  editor.putBoolean("kabulmu",onay); //boolean değer ekleniyor
  editor.commit(); //Kayıt

veya

SharedPreferences sharedPreferences;
sharedPreferences=this.getSharedPreferences("Ayarlar", Context.MODE_PRIVATE);
String adiEkle= editText.getText().toString();
sharedPreferences.edit().putString("adi",adiEkle).apply();

Kayıt Silme (Tamamını Silme)

SharedPreferences ayarSP= getSharedPreferences(Ayarlar,MODE_PRIVATE);
//SharedPreferences ayarSP= context.getSharedPreferences(Ayarlar,Context.MODE_PRIVATE);
        SharedPreferences.Editor editor=settings.edit();
        editor.clear();
        editor.commit();

Kayıt Değiştirme

Diyelim numara kısmını değiştirmek istiyoruz. Bunun için üstte yazdığımız gibi SharedPreference.Editor kullanmamız gerekiyor, tabi editor nesnesin çalışabilmesi için SharedPreference nesnesini de oluşturmayı unutmayın:

SharedPreferences ayarSP= getSharedPreferences(Ayarlar,MODE_PRIVATE);
SharedPreferences.Editor editor=settings.edit();

editor isminde bir Editor nesnesi oluşturduk. Artık ayarlar Preferences’in deki değişkenleri istediğimiz gibi değiştirebiliriz.

int girilenNumara= 234;
editor.putInt("numara", girilenNumara);

Gördüğünüz üzere daha önce veri girdiğimiz numara key’ini putInt diyip key ismini ve değişecek değeri yazdık. Böylece önceki değeri güncellemiş olduk. Tabi güncellemenin kaydedilmesi için commit etmemiz gerekiyor.

editor.commit();

commit() fonksiyonu ile verilerimizi başarılı bir şekilde değiştirmiş oluyoruz.

Kayıt Silme (Seçilen Kayıtları Silme)

Diyelim artık oluşturduğumuz numara isimli key‘e ihtiyacımız yok ve silmek istiyoruz. Bunun için SharedPreference nesnesi ve editor nesnesi gerekiyor. Bu nesnelerin üstte nasıl oluşturulduğu yazıyor. Silmek için editor’ü kullanıp remove fonksiyonu’na hangi isimli key’i sileceğimizi yazıp commit‘liyoruz.

SharedPreferences ayarSP= getSharedPreferences(Ayarlar,MODE_PRIVATE);
SharedPreferences.Editor editor=settings.edit();
editor.remove("numara");
editor.commit();

veya

sharedPreferences.edit().remove("numara").apply();

Aşağıda SharedPreferences ile ilgili bi kaç tablo verdikten soran kodlamaya geçelim.

ParametreAçıklama
MODE_PRIVATEVerilerin tutulduğu dosyaya sadece uygulamamız erişebilir.
MODE_WORLD_READABLE Verilerin tutulduğu dosyayı cihazdaki tüm uygulamalar okuyabilir.
MODE_WORLD_WRITEABLE Verilerin tutulduğu dosyayı cihazdaki tüm uygulamalar okuyabilir ve yazabilir.
MODE_APPENDeni kaydedilen verileri mevcut verilen üzerine yazar.
MODE_ENABLE_WRITE_AHEAD_LOGGINGVeritabanı açık bayrağı. Veritabanına yazmayı, logine esnasında mümkün kılar.
MODE_MULTI_PROCESS SharedPreferences objesi yüklenmiş olmasına rağmen tercihlerdeki değişiklikleri kontrol eden metottur

MetotlarAçıklama
SharedPreferences.contains()Girilen isimde bir preference içerip içermediğini kontrol eder
SharedPreferences.edit()Editör’ü çağırarak preference üzerinde istediğimiz değişiklikleri gerçekleştiririz
SharedPreferences.getAll()Preference’daki tüm verilere (anahtar/değer) ulaşırız.
SharedPreferences.getBoolean()Tercih dosyasındaki boolean tipi değerleri getirir. İki parametre alır. İlk parametre Strink key değeri yani istediğimiz değerin anahtarını, ikinci parametrede ise döndürülecek değer.
SharedPreferences.getFloat()Tercih dosyasındaki float tipi değerleri getirir. İki parametre alır. İlk parametre Strink key değeri yani istediğimiz değerin anahtarını, ikinci parametrede ise döndürülecek değer.
SharedPreferences.getInt()Tercih dosyasındaki int tipi değerleri getirir. İki parametre alır. İlk parametre Strink key değeri yani istediğimiz değerin anahtarını, ikinci parametrede ise döndürülecek değer.
SharedPreferences.getLong()Tercih dosyasındaki long tipi değerleri getirir. İki parametre alır. İlk parametre Strink key değeri yani istediğimiz değerin anahtarını, ikinci parametrede ise döndürülecek değer.
SharedPreferences.getString()Tercih dosyasındaki string tipi değerleri getirir. İki parametre alır. İlk parametre Strink key değeri yani istediğimiz değerin anahtarını, ikinci parametrede ise döndürülecek değer.
SharedPreferences.getStringSet()Tercih dosyasındaki Set<string> tipi değerleri getirir. İki parametre alır. İlk parametre Strink key değeri yani istediğimiz değerin anahtarını, ikinci parametrede ise default olarak döndürülecek değer.

KomutAçıklama
SharedPreferences.Editor.clear()Tüm tercihleri kaldırır.
SharedPreferences.Editor.remove()Belirli tercihleri kaldırır.
SharedPreferences.Editor.putBoolean()Boolean veri tipli bir tercih oluşturur. İki parametre alır. İlk parametremiz adlandırılan String değerli tercihimiz, ikincisi default değerimiz.
SharedPreferences.Editor.putFloat()Float veri tipli bir tercih oluşturur. İki parametre alır. İlk parametremiz adlandırılan String değerli tercihimiz, ikincisi default değerimiz.
SharedPreferences.Editor.putInt()int veri tipli bir tercih oluşturur. İki parametre alır. İlk parametremiz adlandırılan String değerli tercihimiz, ikincisi default değerimiz.
SharedPreferences.Editor.putLong()Long veri tipli bir tercih oluşturur. İki parametre alır. İlk parametremiz adlandırılan String değerli tercihimiz, ikincisi default değerimiz.
SharedPreferences.Editor.putString()String veri tipli bir tercih oluşturur. İki parametre alır. İlk parametremiz adlandırılan String değerli tercihimiz, ikincisi default değerimiz.
SharedPreferences.Editor.putStringSet()Set<String> veri tipli bir tercih oluşturur. İki parametre alır. İlk parametremiz adlandırılan String değerli tercihimiz, ikincisi default değerimiz.
SharedPreferences.Editor.commit()Tüm değişikliklerimizi işler.
SharedPreferences.Editor.apply()Commit() metodu gibi işleve sahiptir ancak apply metodu yazma işlemi yapana kadar beklemez ve akış yoluna devam eder ve boolean değer döndürmez

Şimdi programlamaya geçersek;

Aşağıda anlatılanlara ilişkin örnek mevcuttur, bu örneğin kodlarını

BURADAN github bağlantısından indirebilirsiniz.

activity_sharedpreferences_deneme.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SharedPreferencesDeneme">

    <LinearLayout
        android:id="@+id/layoutA"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginTop="50dp"
        android:gravity="center"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <EditText
            android:id="@+id/editTextad"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="isim gir" />

        <EditText
            android:id="@+id/editTextyas"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="Yaş gir" />

        <CheckBox
            android:id="@+id/CheckBoxonay"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:checked="false"
            android:text="Onaylıyor musunuz?" />

        <Button
            android:id="@+id/button_Kaydet"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Kaydet" />

        <Button
            android:id="@+id/button_oku"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Oku" />

        <Button
            android:id="@+id/button_tamamini_sil"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Tamamını Sil" />

        <Button
            android:id="@+id/button_secileni_sil"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Sadece İsimi SİL" />

    </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>
SharedPreferencesDeneme.class
package com.mobilprogramlar.sharedpreferenceskullanm;
import androidx.appcompat.app.AppCompatActivity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

/*
www.ossmatematik.com
www.mobilprogramlar.com
https://github.com/netmatematiknet/SharedpreferencesKullanimi.git
*/

public class SharedPreferencesDeneme extends AppCompatActivity {
    int yas2;
    String ad2;
    Boolean onay2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sharedpreferences_deneme);

        final SharedPreferences sharedPrefNT = getSharedPreferences("Ayarlar", MODE_PRIVATE);

        final EditText adEditText = findViewById(R.id.editTextad);
        final EditText yasEditText = findViewById(R.id.editTextyas);
        final CheckBox onayCheckBox = findViewById(R.id.CheckBoxonay);
        final Button kaydetBtn = findViewById(R.id.button_Kaydet);
        final Button okuBtn = findViewById(R.id.button_oku);
        final Button silTamaminiBtn = findViewById(R.id.button_tamamini_sil);
        final Button silSecileniBtn = findViewById(R.id.button_secileni_sil);

        kaydetBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String ad = adEditText.getText().toString();
                String yas = yasEditText.getText().toString();

                if (!ad.matches("")){
                    sharedPrefNT.edit().putString("isim", ad).apply();
                    //veya
                    //SharedPreferences.Editor editor = sharedPrefNT.edit();
                    //editor.putString("isim",ad);
                    //editor.apply();
                }
                if (!yas.matches("")){
                    int yas1 = Integer.parseInt(yas);
                    sharedPrefNT.edit().putInt("yas", yas1).apply();
                }
                if(onayCheckBox.isChecked()) {
                    boolean onay=true;
                    sharedPrefNT.edit().putBoolean("Onaylama", onay).apply();
                }else{
                    boolean onay=false;
                    sharedPrefNT.edit().putBoolean("Onaylama", onay).apply();
                }


            }
        });
        okuBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ad2 = sharedPrefNT.getString("isim",null);
                yas2 = sharedPrefNT.getInt("yas",0);
                onay2 = sharedPrefNT.getBoolean("Onaylama",false);
                Toast.makeText(getApplicationContext(),"isim:"+ad2+" yas:"+yas2+" Onaylama:"+onay2,Toast.LENGTH_SHORT).show();
            }
        });
        silTamaminiBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sharedPrefNT.edit().clear().apply();
                //veya
                //SharedPreferences.Editor editor=sharedPrefNT.edit();
                //editor.clear().apply();
                Toast.makeText(getApplicationContext(),"Tüm Kayıtlar SİLİNDİ",Toast.LENGTH_SHORT).show();
            }
        });
        silSecileniBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sharedPrefNT.edit().remove("isim").apply();
                //veya
                //SharedPreferences.Editor editor=sharedPrefNT.edit();
                //editor.remove("isim").apply();
                Toast.makeText(getApplicationContext(),"Sadece İsim SİLİNDİ",Toast.LENGTH_SHORT).show();
            }
        });

    }
}

SharedPreferences’i de global alanda tanımlıyoruz. Bunları global alanda tanımlamamızın nedeni, sadece onCreate metodu içerisinde değil, buton nesnesinin onClick olayında da kullanacak olmamızdan kaynaklanıyor.

Ve sharedPreferences ile “isim” anahtar kelimesine kaydettiğimiz veriyi ad adında oluşturmuş olduğumuz string değişken içerisine çekiyoruz. Aldığı paramatrelerden 1.si anahtar kelime, 2.si ise eğer “isim” anahtar kelimesinin içerisi boşsa, yerine yazılacak default ifade anlamına gelmektedir. Ben eğer “isim” anahtar kelimesinin içerisi boşsa, default değer almasını istemiyorum. Null(boş) olmasını istiyorum.

Bir cevap yazın