Android SharedPreferences Yapısı ve Management Sınıf Oluşturma

522

Bu makalede SharedPreferences depolama yapısını inceleyeceğiz. Standart kullanımını örnekledikten sonra gelişmiş bir projede kullanabileceğimiz şekilde bir sınıf altında derleyip projemize sunacağız. Yazı sonunda oluşan sınıfı rahatlıkla projelerinizde kullanabilirsiniz. Ne de olsa DRY( don’t repeat yourself ) önemli bir kavram 🙂

SharedPreferences

Android platformu veri saklama ve yönetimi konusunda bir çok alternatif sunmaktadır. Bunlar kullanım alanları açısından çeşitlilik gösterir. En temel olanlarından biri SharedPreferences basit anlamda Key – Value olarak bilgi saklanan bir obje bloğudur.

Context  Modları

Context modları oluşturulan depolamanın nasıl davranacağını belirler.

MODE_PRIVATE : Genelde kullandığımız,hatta set edilmediğinde default olarak seçilen moddur. Oluşan Depolamaya sadece tetiklendiği uygulama üzerinden erişim sağlanmasına olanak sağlar.

MODE_WORLD_READABLE : Diğer uygulamaların depolamaya ulaşıp veri okuyabilmesine olanak sağlar.

MODE_WORLD_WRITEABLE : Diğer uygulamaların depolamaya ulaşıp veri okuma yazmasına olanak sağlar.

Şimdi depolama objemizin detaylarına göz atalım

Obje üzerinde düzenlemeler yapmamızı sağlayan yapı Editor Interface’idir. Asıl kullandığımız metotlar editor aracılığıyla bize sunulur. Editör’e göz atalım 🙂

Apply / Commit : Objelerde ki değişikliklerin geçerli olması için Apply veya Commit metotlarının tetiklenmesi gerekir.

Clear: Preferences bloğunun temizlenmesi için kullanılır. Clear ile Preferences blogundaki tüm veri silineceği için  dikkatli kullanılmalıdır.

Remove: Key – Value objenin silinmesi için kullanılır.

putInt(String key, int value): Integer bir veri tutmak istediğimizde kullanılır.
Kullanımı aynı olmakla beraber tüm primitive tipler için bir metot vardır. (putFloat, putLong, ..)

Yukarıda açıkladığımız Apply ve Commit için bir iki dip not yazalım.

Commit metotu yapılan değişiklikleri senkron olarak depolamaya kaydeder. Apply ise asenkron çalışır ve  yapılan değişiklik sonrası direk olarak depolamaya yazar. Preferences yapısı ve o anda yaptığınız değişikliği ve tek bir süreci temsil ettiğinden Commit yerine Apply da kullanablirsiniz. int değerim 5 , String değerim abc oldu şimdi bunları depolayalım veya  int değer 5 depola, String değer abc depola şeklinde ifade etmek gibi…

Bu arada unutmadan önemli bir ayrıntıya parmak basalım. Depolama objesine (SharedPreferences) birden fazla Editor’ün müdahale şansı vardır. Birden fazla editör kısmen de olsa aynı zamanda depolamaya etki etmeye çalışırsa bu yarışı son gelen editör kazanır ve onun dediği olur.

Şimdi Temel kullanımı örnekleyelim.

Depolamaya Veri Yazma

Depolamadan Veri Okuma

Yukarıda ki kodlar SharedPreferences kullanımı için yeterli bir örnek. Bu şekilde yazılan bir kod takır takır çalışır, bir problem yok.  Şimdi sıra bu makalemizin temel konusuna geldi. Yukarıdaki kod yanlış değil ama sürekli kendini tekrar edecek bir kod. Temel yapımızı SharedPreferences’i ve nasıl çalıştığını anladığımıza göre işi biraz daha geliştirelim. Tıkır tıkır çalıştıralım 🙂

SharedPreferences Management Sınıfı

Öncelikle oluşturacağım sınıfı kısaca açıklamakla başlayalım. SharedPreferences depolamasını derli toplu , okunabilirliği artırılmış kullanımı kolay bir sınıf üzerinden yöneteceğiz. Her zaman primitve type’ lar ile çalışmıyoruz. Oluşturacağımız sınıf Generic type üzerinden class ‘ların yönetimini de desteklemeli. Aynı zamanda uygulamanızda birden fazla SharedPreferences da kullanıyor olabilirsiniz.
Bu kötü bir tasarım mı olurdu ? Hayır olmazdı, İhtiyaca göre tabiki olabilir ? is it bad practice to have multiple sharedPreferences?  o halde bizim sınıfımız da bunu desteklesin.

Şimdi kodlara geçelim.

Kodları kısa kısa açıklayacağım.

Sınıfımız birden çok Depolamaya izin vermeli demiştik. Yapıcı metotlar ile bunu sağlıyor olacağız. Dikkat edilmesi gereken yer oluşturulan sınıfın yapıcı  metotları Protected yani bulunduğu package ve alt sınıflarından ulaşılabilir olmaya izin veriyor.
defaultPackageName değişkeni ile herhangi bir depolama tercihimiz yoksa kendimiz bir tane oluşturuyoruz. Mobil uygulamanın vazgeçilmezi json olduğundan GenericType olarak aldığımız veriler Gson kütüphanesi yardımıyla Depolama içinde json obje olarak saklanıyor. Bu yazıyı okuyor ve PreferenceManager sınıfını implement etmeyi düşünüyorsanız zaten vardır ama yoksa da Gson ‘ u projenize eklemeniz gerekecek. 🙂 devam edelim…
Yapıcı metotlar sayesinde kullanacağımız depolama oluşturuluyor. Benim ihtiyacım MODE_PRIVATE olduğundan içeriden statik ekledim. İhtiyaç doğrultusunda parametre olarak gönderilebilir.  Aşağıdaki sınıf bize bir proje içerisinde kullanabileceğimiz int, bool, float, object, String, T Class tüm tipler ve sınıflar üzerinden işlem yapmamıza olanak sağlıyor.  Her tip için get , put metotları oluşturuldu. Generic sınıflar için json çevirisi yapıldı. İstenirse Default değer dönüşleriyle desteklendi.

 

 

Sınıfımızı oluşturduk, Şimdi sıra proje içinde kullanmaya geldi.

Yeni bir sınıf oluşturuyoruz, Bu sınıf içinde static bir değişkende PreferencesManager’ proje için kullanıma açacağız.

Son olarak onCreate metodu üzerinden PreferencesManager sınıfımızı çağıralım.

 

Artık Activity içinde SharedPreferences’i kullanabiliriz.

Bence artık tıkır tıkır çalışıyor. Kod içinde tek satır ile okunabilirliği yüksek anlaması kolay bir şekilde projemizi yürütebiliriz.

Bu arada bir öneri, örneğin android için Activity’ler AppCompatActivity sınıfından extend olurlar. Aman sizin projeniz asla direkt olarak AppCompatActivity den türemesin. Kendiniz bir sınıf oluşturun mesela BaseActivity. Oluşturduğunuz BaseActivity sınıfı AppCompatActivity’ den extend edilsin. Uygulamanızdaki tüm Activity’ler de BaseActivity’ den extend olsun. BaseActivity boş bir sınıf olabilir, hiç önemli değil. İnanın proje sonunda boş kalmaz ki zaten yapılması gereken şeydir. 😉  mesela siz PreferenceManager sınıfınızı BaseActivity sınıfı içinde kullanabilirsiniz 🙂

 

Yorum yaz

Email adresiniz yayınlanmayacaktır.