Makale Özeti

Bu yazımızda Windows Phone 7 ortamında uygulamaların hem uygulama ayarlarını hem de kullanıcı dosyaları dahil her tür veriyi saklayabilecekleri Isolated Storage yapısına giriş yapıyoruz.

Makale

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.
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.