Shared Preferences Kullanımı


   Elinizde basit datalar var ve bunları hızlı,pratik,güvenli bir şekilde saklamayı düşünüyorsanız aradığınızı buldunuz :) Shared Preferences, API 1 den beri bizlere bu işi yapmak için aramızda ve birazdan ona ait herşeyi öğrenmiş olacaksınız. Sizler için sağ üst köşede güzel bir parça bıraktım. Müziksiz bir dünya düşünülemez :)


Hadi başlayalım

   Öncelikle şunu belirterek başlayayım arkadaşlar. Shared preferences'ta sadece belirli basit türden verileri saklayabiliriz yani bunlar String,Integer,Long vs. Shared prefs'in temel elemanı olan Editor, aslında Javanın Map objesi gibi çalışır. Yani içerisine bir key ile o keyin temsil ettiği basit datayı koyabilirsiniz. Bu yapı xml formatında tutulmaktadır. Hikaye şöyle başlıyor.

SharedPreferences sharedPreferences = 
getSharedPreferences("ANAHTAR_KELIME",Context.MODE_PRIVATE)

   Bu kod ile artık elimizde kullanmaya hazır bir sharedPreferences objesi var. Buradaki önemli bir nokta ise, bu sharedPreferences objesini yaratırken ki 2.parametre. Bu parametre bize bu dosyanın yaratılma modunu soruyor aslında.

Dosya Yaratılma Modları

Context.MODE_PRIVATE (Default)

  Buradaki Context.MODE_PRIVATE adından da anlaşılacağı üzere bu objenin sadece bu uygulamaya ait olduğunu(Yani bu package name'e ait olduğu), başka 3.taraf şahıslara kapalı olduğunu belirtiyor. MODE_PRIVATE, en çok kullanılan ve tavsiye edilen modtur.

Context.MODE_WORLD_READABLE || Context.MODE_WORLD_WRITEABLE (Deprecated)

  Bu modlar eskiden bize özgürlük sağlıyordu. Bu modlar ile yarattığımızda diğer uygulamalar başka bir uygulamanın sharedPreferences dosyasına ulaşıp, moda göre okuma yada yazma yapabiliyordu. Taa ki API 17'ye kadar. Özgürlük güvenlik açığı getirdi ve bu özellikler deprecated oldu ve adamlar eğer diğer uygulamarın senin bu dosyana erişmesinde sıkıntı yoksa o zaman dosyanı cihazın sd kartına yaz dediler. Mantıklı da aslında.

Veri yazma ve okuma

Veri yazma

  Bu iş için öncelikle daha önce yarattığımız sharedPreferences objesinin elemanı olan Editor'unu almalıyız. Bu editor üzerinden bilgilerimizi yazacağız. Ama bu elemana okurken ihtiyacımız olmayacak :)

SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString("TEST_KEY","TEST_DATA");
        editor.putString("TEST_KEY2",123123);

        //Burası önemli. Değişiklikleri uygulamak için commit ve apply methodları mevcut. Hangisini seçeceğinize okumadan karar vermeyin :)
        editor.apply(); yada editor.commit();
        

Önemli!! Apply vs Commit

  İki methodta aynı işi yapmalarına rağmen yapma tarzları birbirinden çok farklı. Commit senkron çalışırken, Apply asenkron çalışıyor. Yani commit methodu size geriye bir boolean döndürerek işlemin sonucunu bildiriyor. Eğer yazılmış olduğundan emin olmak istediğiniz bir datanız var ise kesinlik commit kullanmanız gerekiyor. Bunun aksine apply size hiçbirşey söylemez. Yap dersin yapar ancak ne yaptı,nasıl yaptı haberiniz olmaz. Bumerangı atıp arkanıza bakmadığınızı düşünün.

Veri okuma

  Daha önce dediğim gibi veri okumak için yaratmış olduğumuz sharedPreferences objesi işimizi tamamiyle görecektir.

sharedPreferences.getString("TEST_KEY",
"Eğer böyle bir kayıt yok ise bize dönmesini istediğimiz değer")

Bonus : OnSharedPreferenceChangeListener

  Burada bonus olarak sharedPreferences'ın gelişmiş bir özelliğinden bahsedeceğiz. Eğer sharedpreferences objeniz üzerinden daha aktif işler yapacaksanız muhtemelen bu dinleyici ye ihtiyacınız olabilir. Bu dinleyici, sharedPreferences objesinin içerisindeki bir değerde değişiklik olduğunda tetiklenir ve size hangi değerin değiştiğini döndürür.

Set etme

sharedPreferences.registerOnSharedPreferenceChangeListener(new SharedPreferences.OnSharedPreferenceChangeListener() {
            @Override
            public void onSharedPreferenceChanged(
SharedPreferences sharedPreferences, String s) { //Burada bize içeriği değişmiş olan yeni bir
sharedPreferences ve hangi alanın değiştiğini belirten s değişkeni
gelmiştir. } });

Kaldırma

sharedPreferences.unregisterOnSharedPreferenceChangeListener(//Set  
ettiğiniz OnSharedPreferenceChangeListener bir değişkene almalısınız
ki burada onu unregister edebilesiniz :) );

Ne kadar güvenli?

   Yukarıda bahsettiğim gibi sharedPreferences yaratırken ki, dosya yaratılma modunda Context.MODE_PRIVATE yaptığımızda üzerimize düşen görevin bir kısmını yerine getirmiş oluyoruz. Şöyle bir seçenek her zaman vardır; root access almış bir cihazda tamamen patron sizsiniz, ve heryeri herşeyi görebilirsiniz. Eğer bu işin içindeyseniz bu tarz backdoorları da düşünmeniz gerekmektedir.Çünkü herkes sizin cihazınızı,sizin gibi kullanmamakta. Bunun için sharedPreferences dosyanıza yazacağınız bilgilerin güvenliğinden de siz sorumlusunuz. Bunun için bilgilerinizi şifreleyerek yazmanız üzerinize düşeni tamamen yapmanızı sağlayacaktır.Böylece dosyanız ele geçirilse bile, içinde anlaşılmaz veriler olacaktır.

Sonuç

   Android yazılım geliştirme sürecindeki, önemli konulardan biri olan SharedPreferences olayını her yönüyle ele aldık. Neden ihtiyacımız olduğunu,nasıl kullanacağımızı ve ne kadar güvenli olduğunu konuştuk. Örnek proje ve sizler için hazırlamış olduğum quizi en kısa sürede buraya bırakacağım. Eğer bu konuda bir sorun yaşarsanız mail atmaktan çekinmeyin. Yardımcı olmaktan mutluluk duyarım. Şimdilik hoşçakalın...

Örnek projeyi buradan indirebilirsiniz.

Quiz yakında burada olacak.