Isolated Storage w Windows Phone 7  

Udostępnij na: Facebook

Autor: Marcin Kruszyński

Opublikowano: 2011-01-14

W aplikacjach często potrzeba przechowywać dane lokalnie. Szczególne znaczenie ma to w przypadku oprogramowania na urządzeniach mobilnych, gdzie sieć nie zawsze jest dostępna. Obecnie Isolated Storage stanowi jedyny mechanizm przechowywania danych przez aplikacje na telefonie z Windows Phone 7.

Po zapoznaniu się z informacjami zawartymi w tym artykule będziesz:

  • wiedział, co to jest Isolated Storage,
  • znał różnice między jego implementacjami w Silverlight na WP7 i w wersji desktopowej,
  • znał rodzaje danych przechowywane w Isolated Storage i wiedział, jak je zapisywać i odczytywać,
  • znał przykłady rozwiązań, które korzystają z Isolated Storage.

Wprowadzenie

Isolated Storage jest to przestrzeń do przechowywania danych używanych przez aplikacje, gdzie operujemy za pomocą wirtualnego systemu plików i mamy zapewnioną izolację. Do danych aplikacji w Isolated Storage nie mają dostępu inne aplikacje. Żadna z aplikacji nie ma też bezpośredniego dostępu do systemu plików w Windows Phone 7. Zapewnia to bezpieczeństwo i chroni przed nieautoryzowanym dostępem do danych czy ich podmianą.

Isolated Storage jest mechanizmem znanym także programistom desktopowego Silverlight i .NET. Implementacja na WP7 w porównaniu z desktopowym Silverlight różni się zasadniczo pod dwoma względami:

  • nie są obsługiwane strony, dane są przechowywane jedynie na poziomie aplikacji,
  • nie ma quoty na rozmiar na dysku (w wersji desktopowej standardowo 1MB z możliwością zwiększenia, na WP7 standardowy rozmiar równy jest maksymalnemu rozmiarowi aplikacji).

Szczegółowy opis wszystkich różnic znajdziesz w dokumentacji na stronie Differences Between Silverlight and Silverlight for Windows Phone.

**Rys.1. Dane zapisywane w Isolated Storage.

W Isolated Storage aplikacje mogą zapisywać (rys. 1):

  • pliki i foldery,
  • ustawienia.

Pliki i foldery

W zarządzaniu plikami i folderami w Isolated Storage pomocne są klasy:

  • IsolatedStorageFile – reprezentuje przestrzeń Isolated Storage zawierającą pliki i foldery,
  • IsolatedFileStream – eksponuje strumień zapewniający dostęp do pliku w Isolated Storage.

Tworzenie folderu i zapisywanie do niego pliku może wyglądać w następujący sposób:

string folderName = "Data";

string fileName = "data-file.txt";

private void SaveString(string data)

{

    using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())

    {

         if (!isf.DirectoryExists(folderName))

              isf.CreateDirectory(folderName);

         string filePath = System.IO.Path.Combine(folderName, fileName);

         using (IsolatedStorageFileStream rawStream = isf.CreateFile(filePath))

         {

              StreamWriter writer = new StreamWriter(rawStream);

              writer.WriteLine(data);

              writer.Close();

         }

    }

}

Poprzednio zapisane dane w pliku możemy odczytać za pomocą następującego kodu:

private string LoadString()

{

    string result = null;

    using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())

    {

         string filePath = System.IO.Path.Combine(folderName, fileName);

         if (isf.FileExists(filePath))

         {

             try

             {

                 using (IsolatedStorageFileStream rawStream = isf.OpenFile(filePath,

                        System.IO.FileMode.Open))

                 {

                      StreamReader reader = new StreamReader(rawStream);

                      result = reader.ReadLine();

                      reader.Close();

                 }

             }

             catch

             {

             }

        }

     }

     return result;

}

Ustawienia aplikacji

Za pomocą klasy IsolatedStorageSettings możemy przechowywać w Isolated Storage ustawienia naszych aplikacji w postaci słownika z parami klucz-wartość.

Tu pokażemy, jak można zorganizować sobie zarządzanie ustawieniami aplikacji.

W tym celu napiszmy sobie klasę, która będzie enkapsulować  komunikację z Isolated Storage. Dla celów demonstracyjnych dokonujemy zapisu i odczytu jednej logicznej wartości o nazwie LocalizationSetting.

public class AppSettings

{       

    const string LocalizationSettingKeyName = "LocalizationSetting";

    const bool LocalizationSettingDefault = false;

    public bool LocalizationSetting

    {

        get

        {

            return GetValueOrDefault<bool>(LocalizationSettingKeyName,

                   LocalizationSettingDefault);

        }

        set

        {

            SaveValue(NotificationsSettingKeyName, value); 

        }

    }

 }

Kontrolki UI możemy bindować do obiektu tak zdefiniowanej klasy.

W getterach i setterach propercji opakowujących poszczególne ustawienia używamy metod pomocniczych.

Metoda SaveValue dodaje do słownika z ustawieniami nową parę klucz-wartość lub zmienia wartość dla istniejącego klucza, a wprowadzone zmiany zapisuje następnie w Isolated Storage:

public void SaveValue(string key, object value)

{

    IsolatedStorageSettings.ApplicationSettings[key] = value;

    IsolatedStorageSettings.ApplicationSettings.Save();

}

Za pomocą generycznej metody GetValueOrDefault odczytujemy wartość z Isolated Storage lub zwracamy wartość domyślną w przypadku braku danego klucza w słowniku:

public T GetValueOrDefault<T>(string key, T defaultValue)

{

    if (IsolatedStorageSettings.ApplicationSettings.Contains(key))

    {

        return (T) IsolatedStorageSettings.ApplicationSettings[key];

    }

    else

        return defaultValue;          

}

Podane metody do zapisu i odczytu ustawień możemy rozbudować o kod obsługi błędów.

Zastosowanie

Wymienimy tutaj kilka rozwiązań, które swoje działanie opierają na Isolated Storage.      

Obecnie Windows Phone 7 nie posiada dedykowanej dla siebie wersji SQL Server Compact Edition. Możemy jednak dane w Isolated Storage zorganizować na wzór lokalnej bazy danych. Na https://www.codeplex.com rozwijane są takie projekty, jak:  

Ostatnio wzrasta znaczenie mechanizmu synchronizacji w związku z upowszechnianiem się urządzeń mobilnych i źródeł danych w chmurze. Niekiedy potrzebujemy budować aplikacje offline, które potrafią kontynuować działanie przy braku połączenia z siecią i okresowo synchronizują się z serwerem.

Stosunkowo niedawno został udostępniony Microsoft Sync Framework 4.0 October 2010 CTP bazujący na Sync Framework 2.1. W swoim działaniu wykorzystuje on uniwersalny protokół OData+Sync. W obecnym CTP dane z SQL Server czy SQL Azure mogą być udostępniane przez serwis, który zawiera w sobie całą logikę potrzebną do synchronizacji. Uniezależnia to klienta od konkretnych technologii. W tym CTP możemy budować klientów na platformach Microsoft, takich jak: Silverlight, Windows Phone 7 czy Windows Mobile 6.5, oraz na platformach nie związanych z technologiami Microsoft, np. HTML5 i iphone. W pierwszej odsłonie nowej wersji otrzymujemy narzędzia do szybkiego budowania serwisów oraz klientów w Silverlight 3, 4 i na Windows Phone 7. Przy generowaniu klienta w Silverlight tworzone są pliki encji i kontekstu. Lokalne dane w postaci encji oraz metadane potrzebne do ich synchronizacji przechowywane są w Isolated Storage.

Podsumowanie

W tym artykule omówiliśmy mechanizm Isolated Storage i wiemy już, na czym polega jego działanie. Znamy różnice w jego implementacji między Silverlight w wersji desktopowej i na Windows Phone 7. Potrafimy odczytywać i zapisywać w Isolated Storage pliki oraz ustawienia aplikacji. Znamy też przykłady rozwiązań, w których Isolated Storage znalazł zastosowanie.


          

Marcin Kruszyński

Absolwent wydziału EAIE Akademii Górniczo-Hutniczej w Krakowie na kierunku Informatyka. Technologiami Microsoft zajmuje się od sześciu lat. Pracuje w firmie ComArch, gdzie tworzy rozwiązania oparte na platformie .NET i Silverlight. Od dwóch lat jest architektem w centrum badawczo-rozwojowym. Wcześniej zajmował się utrzymaniem oraz rozwojem aplikacji webowych w systemie EDI dla dużych sieci handlowych. Interesuje się wieloma aspektami platformy .NET od pierwszej wersji. Obecnie specjalizuje się w implementacji bogatych interfejsów graficznych aplikacji w oparciu o Silverlight desktop i mobilne i WPF, których rozwój śledzi od początku ich istnienia. Sporo uwagi poświęca też platformie WCF RIA Services. Jest pasjonatem nowych trendów i technologii zwłaszcza w wydaniach CTP i beta, których poznawaniem zajmuje się hobbystycznie i zawodowo. Prelegent grup społecznościowych. Prowadził warsztaty z Silverlight w Krakowie KGD.NET i Wrocławiu PGS. Prezentował tworzenie aplikacji w Silverlight na Windows Phone 7 na Visual Studio 2010 Community Launch we Wrocławiu i Krakowie. Pełnił funkcję eksperta w strefie Ask The Expert ATE technologii Windows Phone na konferencji Microsoft Technology Summit MTS 2010.

Blogi: http://www.marcinkruszynski.blogspot.com, http://www.martinkruszynski.blogspot.com