Jetpack DataStore Nedir? Nasıl Kullanılır? Faydaları Nelerdir?
DataStore Nedir?
Herkese Merhaba,
Bu yazımda Android Jetpack bileşenlerinden DataStore yapısından bahsedeceğim ve beraber basit bir uygulama yapıp örnekler vererek kod üzerinden açıklayacağım.
Hadi başlayalım..
DataStore da neydi? SharedPreferences kardeşim emek iken..
Öncelikle söylemek gerekirse SharedPreferences bizim kendimizi bildiğimiz bir teknolojiydi. Ide çalışmazken, o gradle hataları ile boğuşurken o vardı yanımızda. Çok eski kadim yazılımcıların anlattığına göre Eclipse’te bile yol arkadaşlığı yapmış bu kardeşimiz. Ancak bu kadim dostumuz arada bize küçük şakalar yapıyordu. Peki ne oldu da DataStore SharedPreferences’a “You shall not pass!” Dedi.
SharedPreferences’ın köprüden pardon gözümüzden düşmesinin bir kaç sebebi..
- Canı sıkılınca ANR atması
- UI Thread’de çalışırsam sağım solum belli olmaz mobingi.
- Üstelik sana error handling de yok demesi.
Bunun gibi birkaç sorunu daha var tabi bu abinin, aşağıya bir tablo bırakıyorum, Shared’ı kalbimde…
Ee burada Proto DataStore diye de bir şey var? Proto da bizi görecek mi derseniz, en azından bu yazı da değil belki önümüzdeki yazıda. Ancak şimdilik bu abimizin Preferences Data Store’a ek olarak verileri işlerken kullandığı şemayı özelleştirebildiğimiz bir mekanizması daha var. Çok spoiler verdim.
Kodlamamıza geçmeden iyi bilelim dediğim son kısım.
- Google Analytics’lerde ANR’ler görmeye son. (En azından Shared için)
- Artık DataStore ile Coroutine’in gücünü kullanıp veri saklayacağız.
- Özel olarak ele almak istediğiniz hatalarınız varsa çok işinize yarayabilir.
Herkesin anlayabileceği bir şekilde anlatmaya çalışacağım öyleyse..
💡 Haydi başlayalım!
build.gradle’a ilgili kütüphaneleri ekleyelim.
dependencies { implementation "androidx.datastore:datastore-preferences:1.0.0-alpha01" // Lifecycle componentlerini de ekleyelim
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0"
implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
implementation "androidx.lifecycle:lifecycle-common-java8:2.2.0"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0"}
İsim ve yaşımızı girdiğimiz ve bunu bize gösteren bir app yapalım.
Xml’i
Buraya kadar bir şey yoktu haydi başlıyoruz.
Öncelikle verileri saklayabileceğim bir alt yapı olsun istiyorum Mvvm’e uygun bir mimari kurmak istiyorum. Adı DataStoreRepository olsun ve bir parametresi context olsun.
şimdilik basit bir yapı. Hadi ekleye ekleye gidelim öyleyse. İnsan beyni bilgiyi kategorize ederek öğrenir. Yani size elimden geldiğinde SharedPreferences’tan yola çıkarak anlatmaya çalışacağım ki dediğimiz gibi en başta karışık gibi gelebilen bu şeyi anlayabilelim. :)
Öyleyse hadi biraz bu sınıfın içini dolduralım.
O da ne Shared ile benzer bir yapı. :) Hatta aynısı.
Bir field yaratalım ve tıpkı shared’daki gibi bunu isimlendirelim.
Hadi biraz daha ilerleyelim..Ve sınıfımıza companion object içinde 2 tane key ekleyelim. Ve bu key’lerin özelliklerini ve adını girelim. Tesadüfe bakın ki bu key’ler tıpkı shared ile tıpa tıp aynılar, bir isimleri var ve taşıyacakları bilginin paremetre tipini belirtiyorlar. :)
Buraya kadar aslında her şey hazır. Bir field’ımız var, göndereceğimiz değerlerin ne olduklarını belirledik ve bunların tiplerini belirttik. Hadi o zaman ilk verimizi kaydedelim.
Bir suspend fonksiyon yaratalım *(Coroutinelerin bir özelliği de senkronize çalışmıyorlardı hatırlarsanız. :) İşte bunlar hep suspend fonksiyon yüzünden..) ve bu fonksiyonda sadece isim olsun ve tek parametre alsın.
Gelen veriyi daha önce yarattığımız DataStore Field’ına edit fonksiyonu ile ekliyoruz.. mu?
Hem evet hem hayır :).
Bu yazdığımız fonksiyon butona bastığımızda verilerimizi kaydedecek burada bir sorun yok. Peki ya default değerleri ? Shared’a ihanet mi edeceğiz?
Hemen Shared’a ihanet etmeden bir fonksiyon daha sıkıştırsam araya o da yaş ekleme fonksiyonu olsa..
Tamam iyi güzel de bunların default değerlerini ne yapacağız?
Onlar için de gene aynı sınıf içerisine flow’lar açacağız. Bu flow dediğimiz şeyi aslında coroutinelerin observelenebilir bir yapısı gibi düşünebilirsiniz ancak özel bir yapı, flow dediğimiz bu mekanizma yaratıldığı anda çalışmaz veri toplanılmaya çalışıldığı zaman çalışmaya başlar (DataStore’un gücü giderek ortaya çıkmaya başlıyor.) bu bilgiyi de kenara koyduktan sonra flow’umuzun içinde bunlara default değerlerini atayıp kurtulalım :)
Class’ımızın genel görünümü bu şekilde olmuş oldu.
Aslında her şey bitmiş gözüküyor. :) Bir viewmodel ile bu yapıyı üzerine bir köprü kuralım.
Son olarak activity sayfasında veri çekme ve veri kayıt metodlarını çalıştırmak kaldı. :)
Ekran görüntüsü:
Github: https://github.com/inancyillmaz/DataStoreSample
Dilerim faydalı olmuştur.. :)