Bir uygulama yazarken bazı verilerin uygulama kapatıldığında bile saklanmasını isteriz. Bunun için Android işletim sisteminde birçok yol vardır. Örneğin Sqlite ile bir veri tabanı oluşturmak ancak bu yöntem küçük verilerin saklanması için bu yöntem oldukça zahmetlidir. SharedPreferences bizim tamda bu ihtiyacımızı çözer. Kullanımı çok pratik olmakla beraber küçük verileri zahmetsizce depolamamızı sağlar. 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.
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.Bu veriler
“ /data/data/PACKAGE_NAME/shared_prefs/PREFERENCES_FILENAME.xml”
şeklinde dosya yolunda tutulur.
SharedPreferences’in içinde String, Int, Boolean, Float, Long tipinde değerler depolanabilir. Uygulama kapansada kaydedilen bu değerler silinmez veya kaybolmaz.
Şimdi SharedPreferences’i Kotlin dilinde nasıl kodlayacağımızı inceleyelim.
Yapmamız gerek ilk iş bir SharedPreferences nesnesi elde etmek olmalıdır.Bunu yapmanın birkaç yolu vardır.
getPreferences(PREFS_MODE)
Kayıt ettiğimiz veriyi sadece yine o activity’de okuyabiliriz. Kayıt ettiğimiz veriyi diğer activity’lerde okuyamayız.
PrefenceManager.getDefaultSharedPreferences(Context)
Dosya ismini paket adına göre otomatik verir. Veriler tüm projede okunabilir ve değiştirilebilir.
getSharedPreferences(PREFS_FILENAME, PREFS_MODE)
Dosya ismini ve okuma modunu biz veririz.
Temelde 3 yöntemde kullanılabilir. 6 farklı mod vardır.
- MODE_APPEND : Yeni kaydedilen verileri mevcut verilen üzerine yazar.
- MODE_ENABLE_WRITE_AHEAD_LOGGING : Database open flag. When it is set , it would enable write ahead logging by default
- MODE_MULTI_PROCESS : This method will check for modification of preferences even if the sharedpreference instance has already been loaded
- 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.
SharedPreferences nesnesini oluşturduktan sonra edit()
metodunu kullanarak veriye dosyaya yazacak bir Editor nesnesi oluşturmalıyız.
val prefences = getSharedPreferences(PREFS_FILENAME, Context.MODE_PRIVATE)val editor = prefences.edit()
Editor nesnesini temel metodları şunlardır;
- clear()
Editor’daki tüm verileri siler.
- remove(key:String)
Anahtar değerini vererek dosyadan bir veriyi siler.
- apply()
Editor’daki verileri dosyaya asynchronously olarak yazar. İşlem bittiğinde başarısı hakkında sizi bilgilendirmez.
- commit()
Editor’daki verileri dosyaya synchronously olarak yazar. İşlem bittiğinde işlemin başarısı hakkında sizi bilgilendirir.
- putLong(key:String, value:Long )
Editor’e Long tipinde bir veri kaydeder. Birinci parametre anahtar, ikinci parametre ise değerdir.
- putInt(key:String, value:Int )
Editor’e Int tipinde bir veri kaydeder. Birinci parametre anahtar, ikinci parametre ise değerdir.
- putFloat( key:String, value:Float )
Editor’e Float tipinde bir veri kaydeder. Birinci parametre anahtar, ikinci parametre ise değerdir.
- putString( key:String, value:String )
Editor’e String tipinde bir veri kaydeder. Birinci parametre anahtar, ikinci parametre ise değerdir.
- putBoolean( key:String, value:Boolean )
Editor’e Boolean tipinde bir veri kaydeder. Birinci parametre anahtar, ikinci parametre ise değerdir.
Verileri tekrar okumak için ise aşağıdaki gibi bir kod bloğu kullanılabilir.
val prefences = getSharedPreferences(PREFS_FILENAME, Context.MODE_PRIVATE)val name = prefences.getString(KEY_NAME,"DEFAULT_VALUE")
Şimdi bir örnek yapalım;
Örnekte yapacağımız uygulamanın amacı uygulama açıldığında kullanıcının adını,yaşını ve boy bilgisini alıp SharedPreferences kullanarak verileri kaydedip ardından uygulama kapatıp tekrar açarak bu verileri bir Toast mesajı ile ekranda göstermektir.
Öncelikle tasarım yapmaya başlayalım.
<?xml version="1.0" encoding="utf-8"?><android.support.constraint.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=".MainActivity">
<EditText android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="8dp" android:layout_marginTop="160dp" android:ems="10" android:hint="İsim" android:inputType="textPersonName" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.527" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" />
<EditText android:id="@+id/age" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:ems="10" android:hint="Yaş" android:inputType="number" app:layout_constraintEnd_toEndOf="@+id/name" app:layout_constraintStart_toStartOf="@+id/name" app:layout_constraintTop_toBottomOf="@+id/name" />
<EditText android:id="@+id/height" android:layout_width="217dp" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:ems="10" android:hint="Boy" android:inputType="numberDecimal" app:layout_constraintEnd_toEndOf="@+id/age" app:layout_constraintStart_toStartOf="@+id/age" app:layout_constraintTop_toBottomOf="@+id/age" />
<Button android:id="@+id/save" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="8dp" android:layout_marginTop="8dp" android:text="Kaydet" app:layout_constraintEnd_toEndOf="@+id/height" app:layout_constraintStart_toStartOf="@+id/height" app:layout_constraintTop_toBottomOf="@+id/height" /></android.support.constraint.ConstraintLayout>
Tasarım işlemini bitirdikten sonra MainActivity’in içine aşağıdaki kod bloğu yazılır.
val PREFS_FILENAME = "com.ekremh.prefs"val KEY_NAME = "NAME"val KEY_AGE = "AGE"val KEY_HEIGHT = "HEIGHT"override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val prefences = getSharedPreferences(PREFS_FILENAME, Context.MODE_PRIVATE)val editor = prefences.edit()//Dosyadan okurken ilk parametre anahtar değer ikincisi ise okuma //işlemi başarısız olursa yada dosyada böyle bir değer yoksa //atanacak DEFAULT değerdir. Toast.makeText(applicationContext,"Name : ${prefences.getString(KEY_NAME,"DEFAULT_VALUE")}\n" +"Age : ${prefences.getInt(KEY_AGE,0)}\n" +"Height ${prefences.getFloat(KEY_HEIGHT,0f)}",Toast.LENGTH_SHORT ).show()save.setOnClickListener {editor.putString(KEY_NAME,name.text.toString())editor.putInt(KEY_AGE,age.text.toString().toInt())editor.putFloat(KEY_HEIGHT,height.text.toString().toFloat())editor.apply() // Dosyaya yazılır.Toast.makeText(applicationContext,"Kayıt Başarıl...",Toast.LENGTH_SHORT).show()}}
Tüm bu işleri yaptıktan sonra uygulamayı açınca daha önce girdiğiniz isim,yaş ve boy bilgisini göstermesi gerekmektedir.
ÖNEMLİ NOT : Verilerinizin güvenliği için hashleyip öyle kaydediniz.
Sonuç
Hepsi bu kadar. Bu yazıda, SharedPreferences kavramının ne işe yaradığını ve Android uygulama geliştirirken Kotlin dili ile nasıl kullanılacağını öğrendiniz.
Hiç yorum yok:
Yorum Gönder
Görüş ve Düşüncelerinizi Bizimle Paylaşmayı Unutmayın.