20 Nisan 2011

Windows Phone 7 de Veri Depolama - 1

IsolatedStorage


Windows Phone 7 uygulamalarımızda, veri kaynaklarına erişim için uygulama her açıldığında bir sunucu üzerinden web servisleri ile bağlantı kurarak verileri tekrar tekrar almak zorunda olmadığımızı söyleyerek makalemize başlayabiliriz. Bir windows phone uygulamasında uygulamamıza özgü tahsis edilecek olan isolated- storage (yalıtılmış/izole edilmiş depolama alanı) veri deposunu kullanabiliriz. Adından da alaşılacağı gibi bu alana verilerimizi yazabilir ve ihtiyaç duyduğumuzda rahatlıkla tekrar okuyabiliriz. Bu bellek alanı izole
edilmiş bir depolama alanı olduğu için yalnızca kendi uygulamamız tarafından yönetebilir olacağız.

Windows Phone 7 de isolated-stoarage' in kullanımında 2 temel yol vardır. Bunlardan birincisi bir basit anahtar ve değer çifti ile  (key-value pair) oldukça sade ve kolay kullanım yoludur. Diğer yol ise dosya erişim sistemi kullanarak (System.IO) stream 'ler (akış) ile dosyalara verilerimizi yazıp okuyabiliriz olacağız.
Örnek verecek olursak, uygulama kullanıcılarının bir uygulamayı her başlattıklarında kullanıcı adlarını tekrar tekrar yazmak istememeleridir, ya da sabit ve sürekli kullanılacak bir takım verileri isolated-storage alanında saklamak ve ihtiyaç duyulduğunda hızlıca ulaşmak performans, hız gibi konularda bize artı sağlayacaktır.
IsolatedStorageSettings sınıfını kullanarak ilk örneğimizde basit bir giriş ekranı oluşturalım. Aşağıdaki örneğimizde kullanıcı giriş ekranı üzerinde bulunan kullanıcı adı textbox nesnemiz eğer daha önce kullanıcı adı
girişi yapılmış ise dolu gelecek ve kursör şifre passwordbox nesnesine focus olacak.

XAML


<Grid x:Name="ContentPanel" Grid.Row="1" 
      Margin="12,0,12,0">
    <StackPanel>
        <TextBlock Text="Kullanıcı Adı"
                   Margin="10,0,0,0"/>
        <TextBox x:Name="txtUserName"/>
        <TextBlock Text="Şifre"
                   Margin="10,0,0,0"/>
        <PasswordBox x:Name="txtSifre"/>
        <Button x:Name="btnGiris" 
                Width="200" Height="80"
                Content="Giriş"
                HorizontalAlignment="Right"
                Click="btnGiris_Click"/>
    </StackPanel>
</Grid>

C#


private void MainPage_Loaded(object sender, RoutedEventArgs e) {
  string userName;
  IsolatedStorageSettings.ApplicationSettings.TryGetValue<string>("UserName",
                                                                      out userName);
  if (!string.IsNullOrEmpty(userName)) {
    txtUserName.Text = userName;
    txtSifre.Focus();
  }
  else {
    txtUserName.Focus();
  }
}
private void btnGiris_Click(object sender, RoutedEventArgs e) {
  IsolatedStorageSettings.ApplicationSettings["UserName"] = txtUserName.Text.Trim();
}
 























Yukarıdaki örnekte kullandığımız key-value pair yönteminde komplex bir objeyi de tercih edebiliriz.

C#


private void MainPage_Loaded(object sender, RoutedEventArgs e) {
  UserInfo user;
  IsolatedStorageSettings.ApplicationSettings.TryGetValue<UserInfo>("User",
                                                                     out user);
  if (user != null) {
    txtUserName.Text = user.KullaniciAdi;
    txtSifre.Focus();
  }
  else {
    txtUserName.Focus();
  }
}
 
private void btnGiris_Click(object sender, RoutedEventArgs e) {
  UserInfo user = new UserInfo() { KullaniciAdi= "gokhan", 
                                   KullaniciId = 1,
                                   KullaniciIsim = "Gökhan Manduz"
                                 };
  IsolatedStorageSettings.ApplicationSettings["User"] = user;
}
Uygulamamızın Isolated-Storage ApplicationSettings içerisinde bulunan bir değeri elde etmek için her defasında TryGetValue methodunu tekrar tekrar yazmaktansa aşağıdaki gibi daha merkezi bir çözüm ile jenerik bir method kullanarak da işimizi kolaylaştırabiliriz.

C#


public T GetAppSettingValue<T>(string key) {
  object value;
  if (IsolatedStorageSettings.ApplicationSettings.TryGetValue(key,
        out value)) {
            return (T)value;
   }
  return default(T);
}

Data Binding ile Isolated-Storage Kullanımı

Alternatif olarak farklı bir yöntemlede arayüzde kullandığımız textbox nesnesi kullanıcı adını DataBinding
yöntemi kullanarak bağlamak. İlk önce içerisinde string tipinde bir property barındıran sınıfımızı oluşturalım. Bu sınıfımızın görevi isolated-storage'e veri yazma ve okuma olsun.

C#


public class AppSettingsClass {
  public string UserName {
    get {
      string user;
      if (IsolatedStorageSettings.ApplicationSettings.TryGetValue("UserName",
                                                                  out user)) {
        return user;
      }
      return "";
    }
    set {
      IsolatedStorageSettings.ApplicationSettings["UserName"] = value;
    }
  }
}
Geriye yalnızca xaml kodları kullanarak kullanıcı adı textbox nesnesine iki yönlü olarak (TwoWay) yukarıdaki sınıfta belirttiğimiz UserName string property'sini bind etmek kalıyor; ilk önce App.xaml dosyasına kullanacağımız namespace'i local adıyla tanımlayalım. Daha sonra MyDataSettings adıyla Resource bölümüne AppSettingsClass tanımlamamızı yapalım.

XAML (App.xaml)

<Application 
    x:Class="WP7StorageSample.App"
    xmlns:local="clr-namespace:WP7StorageSample"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"       
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone">
    
    <Application.Resources>
        <local:AppSettingsClass x:Key="MyDataSettings" />
    </Application.Resources>
    
    <Application.ApplicationLifetimeObjects>
        <shell:PhoneApplicationService 
            Launching="Application_Launching" Closing="Application_Closing" 
            Activated="Application_Activated" Deactivated="Application_Deactivated"/>
    </Application.ApplicationLifetimeObjects>
 
</Application>

Kullandığımız kullanıcı adı Textbox nesnemizi de aşağıdaki gibi xaml kodları yardımıyla düzenleyelim. Binding modu TwoWay olacağından dolayı textbox her değiştiğinde otomatik olarak isolated-storage'e yazılan değer kaydedilecektir ve sayfa sayfa açıldığında da textbox üzerine isolated-storage'den okunan değer bind edilecektir.

XAML (MainPage.xaml)


<TextBox x:Name="txtUserName"
         DataContext="{StaticResource MyDataSettings}"
         Text="{Binding UserName, Mode=TwoWay}"/>

IsolatedStorageFileStream Kullanımı


Yazımızın başlarında da belirttiğimiz gibi isolated-storage'in bir diğer kullanım tekniği de IsolatedStorageFileStream ile yalıtılmış bellek alanı içerisinde bir dosyaya veya dosyalar üzerinde yazma ve okuma işlemlerini rahatlıkla uygulayabiliriz. System.IO 'dan alışık olduğumuz File.Exist, File.Create gibi methodları kullanabileceğimiz gibi bir StreamReader veya StreamWriter nesnesini kullanarak File üzerinde veri depolama işlemlerimizi yapma şansımız da olacak.

Şimdi StreamWriter ve StreamReader sınıflarını da kullanarak dosya oluşturup yazma ve okuma işlemlerini
gerçekleştireceğimiz örneğimizi yazmaya başlayalım.

C#


private void btnKaydet_Click(object sender, RoutedEventArgs e) {
  using (var myStream =
         new IsolatedStorageFileStream("demo.txt"FileMode.Create,
         IsolatedStorageFile.GetUserStoreForApplication()))
  using (var writer = new StreamWriter(myStream)) {
    writer.WriteLine("Bu string cümlesini deneme isimli dosyaya yazdım.");
  }
  MessageBox.Show("Kaydedildi.");
}
C#


private void btnOku_Click(object sender, RoutedEventArgs e) {
  using (var myStream = 
         new IsolatedStorageFileStream("demo.txt"FileMode.Open,
         IsolatedStorageFile.GetUserStoreForApplication()))
  using (var reader = new StreamReader(myStream)) {
    var text = reader.ReadToEnd();
    MessageBox.Show(text);
  }
}
Peki default olarak ayrılmış olan isolated-storage alanı ihtiyacımızı karşılamayacak olursa? Bu durumda aşağıdaki gibi byte bazında kotayı arttırabiliriz. Eğer artış sağlanırsa dönüş değeri true aksi durumda false 
olacaktır.

C#


var isolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication();
bool result = isolatedStorageFile.IncreaseQuotaTo(100000);
Windows Phone 7 de Sql Server Compact gibi bir veritabanı teknolojisi desteklenmediği için verilerimizi telefon üzerinde saklamak ve ihtiyaç durumunda tekrar kullanmak için IsolatedStorage bellek alanına oldukça 
fazla ihtiyaç duyulacak gibi görünüyor. Bir sonraki makalelerimizde verilerimizi sanki bir veri tabanı teknolojisi ile çalışıyormuşuz gibi insert, update ve delete methodları oluşturarak static resource dosyaları üzerinde işlemlerimizi gerçekleştirebilmek üzere bu makalemizi burada sonlandıralım.

Kolay gelsin.

gokhanmanduz@hotmail.com

Hiç yorum yok: