Windows Phone 7 içerisinden kullanıcılara doğrudan bir dosya sistemi
gösterimi yapılmıyor aynı şekilde yazılım geliştiriciler de herhangi bir dosya
sistemine erişim yapamıyor. Yani bizim Windows Mobile 6.x'ten alışık olduğum gibi
uygulamalar dosyalarını dosya sisteminde bir yerlere kaydetmiyorlar.
Kullanılacak
model her uygulamanın kendi
IsolatedStorage alanını kullanması. Varsayılan ayarlarla her uygulamaya 2GB
kota veriliyor. Her uygulama kendi dosyalarını buraya
saklayarak uygulama açıldığında da aynı alana erişerek kullanıcıya gerekli
dosyaların bir listesini gösterebilir. Böylece son kullanıcı bakış açısı ile çok
daha derli toplu bir sistem yaratılmış oluyor. Diğer yandan uygulamaların
işletim sisteminin bulunduğu olası bir dosya sistemine erişmemesi de güvenlik
açısından çoğu sorunun önünü kesiyor. Tüm bu sistem içerisinde
uygulamanızın ayarları da aynı şekilde IsolatedStorage içerisinde tutulabiliyor.
Bu örneğimizde WP7 içerisinde ufak bir Silverlight uygulaması yaparak kendi
tanımladığımız custom bir entity'yi IsolatedStorage içerisinde uygulama ayarı
olarak saklayacağız.
[XAML]
<Grid x:Name="ContentGrid" Grid.Row="1">
<TextBox Height="74" HorizontalAlignment="Left" Margin="120,51,0,0" Name="textBox1" Text="TextBox" VerticalAlignment="Top" Width="322" />
<TextBox Height="74" HorizontalAlignment="Left" Margin="120,131,0,0" Name="textBox2" Text="TextBox" VerticalAlignment="Top" Width="322" />
<Button Content="Button" Height="63" HorizontalAlignment="Left" Margin="167,227,0,0" Name="button1" VerticalAlignment="Top" Width="242" Click="button1_Click" />
</Grid>
İlk olarak uygulama ekranına iki adet TextBox ve bir de Button
yerleştiriyoruz. Bu TextBox'lar içerisindeki verileri bir Entity'ye aktardıktan
sonra söz konusu Entity'yi de IsolatedStorage içerisinde ApplicationSetting
olarak saklayacağız. Kaydetme işlemini doğrudan Button'un Click durumunda
yapabiliriz.
[C#]
public class Urun
{
public string Adi { get; set; }
public int Stok { get; set; }
}
Yukarıdaki gördüğünüz sınıf örneğimiz için kullanacağımız basit bir Entity.
TextBox'lar içerisindeki verileri ürünün adı ve stok bilgisi şeklinde
ilişkilendireceğiz. IsoStore içerisinde tüm ApplicationSetting'ler birer String
olarak saklanabildiği için bizim de eldeki Entity'yi bir şekilde string'e
serialize etmemiz sonrasında da tabi aynı bilgisi IsoStore'dan okurken
DeSerialize etmemiz gerekecek. Bunun için en uygunu hızlıca JSON formatını
kullanabileceğimiz DataContractJsonSerializer sınıfından
faydalanmak. System.ServiceModel.Web'i projemize referans olarak eklediğimiz
gibi artık yolda devam etmeye hazırız.
System.ServiceModel.Web'i referans olarak alıyoruz.
[C#]
private void button1_Click(object sender, RoutedEventArgs e)
{
Urun BirUrun = new Urun();
BirUrun.Adi = textBox1.Text;
BirUrun.Stok = int.Parse(textBox2.Text);
string json = "";
using (MemoryStream ms = new MemoryStream())
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(BirUrun.GetType());
serializer.WriteObject(ms, BirUrun);
ms.Position = 0;
using (StreamReader reader = new StreamReader(ms))
{
json = reader.ReadToEnd();
}
}
IsolatedStorageSettings.ApplicationSettings["BizimUrun"] = json;
}
Yukarıdaki kodumuz kaydetme düğmemizin arkasındaki kod. Kaydet düğmesine
basıldığı gibi Entity'mizden bir adet yaratıp gerekli bilgileri de
TextBox'lardan Property'lere atadıktan sonra bir DataContractJsonSerializer
yaratarak entity'yi eldeki MemoryStream'e serialize ediyoruz. Sonunda da
MemoryStream'i okuyarak String bilgiyi alıp hızlıca ApplicationSettings
içerisinde Key/Value Pair tadında saklıyoruz. Artık uygulamanızı kapatıp açsanız
bile sürekli uygulamanıza ait IsoStore içerisinde bu Entity bulunacaktır. Son
olarak sıra geldi kaydettiğimiz bu veriyi, uygulama ayarını bir şekilde
IsoStore'dan okuyarak uygulama ilk açıldığında TextBox'lara eski değerleri
atamaya.
[C#]
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
if (IsolatedStorageSettings.ApplicationSettings.Contains("BizimUrun"))
{
Urun BirUrun;
string json = IsolatedStorageSettings.ApplicationSettings["BizimUrun"].ToString();
using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Urun));
BirUrun = (Urun)serializer.ReadObject(ms);
}
textBox1.Text = BirUrun.Adi;
textBox2.Text = BirUrun.Stok.ToString();
}
}
Uygulamamız ilk açıldığında IsoStore içerisinde elimizdeki Key olan "BizimUrun"'e
denk gelen bir Value var mı kontrolünü yaptıktan sonra eğer daha önce veri
kaydedilmiş ise hemen okuma işlemine geçiyoruz. Yeni bir Entity yarattıktan
sonra eldeki String JSON değerini AppSettings'den alıp ByteArray'den
MemoryStream yaratıyoruz. Geriye kalan artık söz konusu MemoryStream
içerisindeki verinin DataContractJsonSerializer tarafından bir
Urun nesnesine DeSerialize edilmesi. İşlem tamamlandıktan sonra
da Entity içerisindeki değerleri rahatlıkla uygulama arayüzündeki kontrollere
atayabiliriz.
Sonuç
Gördüğünüz gibi aslında herşey normal Silverlight development tarafı ile
neredeyse bire bir aynı. Bu noktada önemli olan aslında bunun artık WP7'de
uygulama geliştirme modeli olması. IsolatedStorage WP7'de çok önemli bir yere
sahip ve her uygulamanın doğrudan Runtime tarafından yönetilen kendi disk
alanına sahip olmasına olanak tanıyor. Böylece artık dosya sisteminde dosyayı
bulup ilişkili programlama açma devri kapanıyor onun yerine ilişkili program
açılıp onun içerisinden dosyaların listesi görünerek uygun dosya seçilik
açılabiliyor. Tabi bu bahsettiğimiz IsoStore'un normal FileSystem modunda
kullanımı, diğer yandan uygulama ile ilgili kullanıcının doğrudan kaydetme
işlemi yapmadığı ve bizim yönettiğimiz veriler bu makalede gördüğümüz üzere
ApplicationSetting olarak saklanabiliyor.
Hepinize kolay gelsin.
Daron Yöndem