Android veri depolama için birkaç farkı yöntem sunuyor. Bunları kendi sitesinde şöyle sıralamış:
- Shared Preferences: Store private primitive data in key-value pairs.
- Internal Storage: Store private data on the device memory.
- External Storage: Store public data on the shared external storage.
- SQLite Databases: Store structured data in a private database.
- Network Connection: Store data on the web with your own network server.
Database kadar olmasa da shared preferences ufak tefek veri depolayıp/erişmek için kullanılası bir şey. Öyle büyük verilerle uğraşmadıkça database yerine tercih edilebilir.
Hash table yapısındaki gibi key-value prensibi ile çalışıyor farklı olarak yalnızca primitive tipler için kullanılabiliyor. Saklayabildiği tipler şunlar:
- boolean
- float
- int
- long
- string
Çalıştığım projede böyle bir şey kullanma ihtiyacı duymuştum. Biraz araştırdıktan sonra işimi gördüm ama buraya da yazayım ki belki başkalarının da işine yarar bir gün.
Örnek bir uygulama üzerinde nasıl olacağını görelim. Öncelikle uygulamanın paylaşılan tercihlerine (bu şekilde çevirsem problem olmaz umarım) erişmek ve eğer daha önceden yoksa bir xml dosyası oluşturmamız gerekir. Verilerin yazıldığı dosya bir xml dosyası. Bunun için aşağıdaki kodu kullanabiliriz:
SharedPreferences mSharedPrefs = getSharedPreferences("xmlFile",
MODE_PRIVATE);
İlk parametre oluşacak dosyanın ismini, ikincisi de hangi modda olacağını belirtiyor. MODE_PRIVATE ile bu dosyanın sadece bizim uygulamamız tarafından erişilebileceğini belirttik. Bundan sonraki adım da dosyayı editlemek için erişmemiz gerekir. Aşağıdaki satır ile de bunu sağlıyoruz.
SharedPreferences.Editor mPrefsEditor = mSharedPrefs.edit();
Artık dosyaya ulaştık. Buraya yukarda da belirttiğim gibi boolean, float, int, long ve/veya string veriler yazıp/okuyabiliriz. Yazmak için put, almak için de get metodları [putString(), getBoolean()...] zaten geliyor.
Örnek uygulamamızda, uygulamanın kaç defa çalıştığını ekranda göstermek istediğimizi düşünelim. Bunun için bir sayaç oluşturalım ve bu değeri paylaşılan tercihlerden okuyalım. Daha sonra da bir textView ile ekranda gösterelim.
int mCounter = mSharedPrefs.getInt("counter", 0);
mCounter değişkenimize xmlFile içindeki “counter” isimli anahtarın değerini atıyoruz. getInt()[ve diğer getXXX] metodlarının aldığı ikinci parametre de default değer. Yani xml dosyası ortada yoksa ya da herhangi bir şekilde ordaki değeri alamazsak, default değerimiz geri dönüyor. Ayrıca dosyadan değer okumak için bir önceki satırdaki gibi editör oluşturmaya gerek yoktu. Editörü dosyaya yazmak için kullanacağız. Satırlar yer değişse ya da ikinci satır aradan çıksa da uygulama şimdilik çalışır.
Uygulamanın daha önce kaç defa çalıştırıldığını görmek için de aşağıdaki kodu yazıyoruz. Daha önceden main.xml içinde tanımladığımız textView nesnesinin text özelliğini, sayacımızın değeri ile güncelliyoruz.
TextView tv = (TextView) findViewById(R.id.tvSampleTv);
tv.setText("Uygulama daha önce " +String.valueOf(mCounter) + " defa çalıştırıldı.");
Uygulamamızı şimdi çalıştırırsak aşağıdakine benzer bir görüntü elde etmiş olmamız lazım.

Benim bu örnekte kullandığım main.xml de aşağıdaki gibi.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tvSampleTv" android:textStyle="bold" android:textColor="#FFFFFF" android:layout_gravity="center"></TextView> </LinearLayout>
Sayfamız görüntülendiğine göre artık uygulamamız bir defa daha çalışmış oldu. Demek ki artık sayacı artırmamız gerekecek. Bunun için de aşağıdaki satırları yazalım.
mPrefsEditor.putInt("counter", ++mCounter);
mPrefsEditor.commit();
Nasıl database bağlantısı yapıp işlerimizi hallettikten sonra bağlantıyı kapatıyorsak, dosya açıp yazdıktan sonra dosyayı kapatıyorsak bunda da benzer bir durum (ama aynı değil tabi ki, sadece unutulmaması gereken bir şey olduğu için bu benzetmeleri yaptım. İntegral sınavlarındaki +c kadar önemli vallahi :)) olaraktan yaptıklarızı işlememiz lazım. commit() bunun için kullanıldı.
Uygulamayı bu haliyle çalıştırdığımızda yine ilk ekran görüntüsü gelecek. Yeni halini ilk defa çalıştırmış oluyoruz çünkü. Tekrar çalıştırdığımızda aşağıdaki,

üç defa daha çalıştırdıktan sonra da aşağıdaki görüntüye benzer şeyler görünmesi lazım.

Uygulamanın class kodu da aşağıdaki gibi şekillendi.
package com.oguz.example;
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.widget.TextView;
public class SharedPrefsExample extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
SharedPreferences mSharedPrefs = getSharedPreferences("xmlFile",
MODE_PRIVATE);
SharedPreferences.Editor mPrefsEditor = mSharedPrefs.edit();
int mCounter = mSharedPrefs.getInt("counter", 0);
TextView tv = (TextView) findViewById(R.id.tvSampleTv);
tv.setText("Uygulama daha önce " + String.valueOf(mCounter)
+ " defa çalıştırıldı.");
mPrefsEditor.putInt("counter", ++mCounter);
mPrefsEditor.commit();
}
}
Şimdi bu uygulamayı yaptık da ne oldu? Evet pek bi ekşın yok ortada çünkü örnek seçimini pek sağlıklı yapmadım. Seçtiğim örnek anlatmak istediğim olaya pek uygun değil ama o kısmı da burda anlatsam herhalde eksiği tamamlarım. Uygulamada tek activity olduğu için pek bir yararını göremedik ama uygulamamızın içindeki tüm classlardan bu özelliklere erişip / değişiklik yapabileceğimizi bilmemiz belki getirdiği kolaylığı farketmemizi sağlayabilir. Üstelik ram gibi program boyunca kalıp tekrar başlatıldığında da kaybolmuyor. Uygulama cihazda bulunduğu sürece değerler korunuyor. Belki bu açıklama örnek seçimimdeki açığı biraz kapatmıştır :)
Oluşan xml dosyamızı da /data/data/paket.adi/shared_prefs altında bulabilir. En başta belittiğimiz moda göre erişim hakları düzenleniyor.
