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 saklama, kullanma 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 putBoolean, String 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.
Parametre | Açıklama |
---|---|
MODE_PRIVATE | Verilerin 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_APPEND | eni kaydedilen verileri mevcut verilen üzerine yazar. |
MODE_ENABLE_WRITE_AHEAD_LOGGING | Veritabanı 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 |
Metotlar | Açı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. |
Komut | Açı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.