Silverlight 2.0 - Ukladanie dát na strane klienta

Publikoval Michal Kočí dňa 9.5.2008 o 00:35 v kategórii Silverlight

Nie je nič neobvyklé, že si aplikácia ukladá rôzne nastavenia a iné pomocné súbory na strane klienta, napríklad Windows aplikácia do súboru, webová aplikácia do Cookies. Ako si ukladať dáta na klienta v Silverlight aplikácii je obsahom tohto príspevku.

Trocha nudnej teórie

Začnem trochu nudnou ale podstatnou teóriou. Keďže Silverlight aplikácia beží na klientovi v tzv. sandbox móde, čo je mód kedy jej práva sú minimalizaované, aby nebolo možné klientský počítač napadnúť, je logické, že dáta si nebudete môcť na klientský počítač ukladať kde sa Vám zapáči. A nie len, že ich nemôžete ukladať kde chcete, Vy navyše ani nemusíte a ani nebudete vediet, kde sú Vaše dáta uložené. Budete totiž dáta môcť ukladať len do izolovaného úložiska (tzv. Isolated Storage). Toto úložisko môžete používať aj v plnom .Net-e a tak ho možno poznáte.

Toto úložisko si kludne môžete predstaviť ako akýsi disk vyhradený len pre Vás, do ktorého má prístup iba Vaša aplikácia. Rovnako ako pri iných úložiskách, aj tu máte možnosť vytvárať adresáre a ich hierarchiu. V adresároch alebo v roote máte možnosť vytvárať súbory, do ktorých si môžete ukladať dáta.

Aby to nebolo také jednoduché, má Vaša aplikácia ešte jedno obmedzenie a to je obmedzenie veľkosti. Je to ochrana pred tým, aby si aplikácia na klienta neukladala veľké dáta bez toho, aby o tom bol užívateľ uzrozumený. Preto defaultne máte k dispozícii 100KB. Samozrejme, máte v prípade potreby možnosť požiadať o ďaľšie miesto, ale vtedy vstupuje do hry užívateľ, ktorý musí Vašu požiadavku akceptovať:

Okrem izolovaného úložiska v podobe jeho adresárov a súborov môžete v Silverlighte používať aj aplikačné nastavenia v podobe triedy ApplicationSettings. Nevýhodou (alebo možno v niektorých prípadoch to môže byť aj výhodou) tejto triedy je, že dáta nie sú trvalé a teda po vypnutí a opätovnom spustení aplikácie všetko čo ste si do aplikačných nastavení uložili je preč. To našastie neplatí pre súbory a adresáre v izolovanom úložisku. Preto sa triede ApplicationSettings v tomto príspevku venovať nebudem. Aj tak sa jedná o jednoduchú triedu, kde najdôležitejšie sú metódy Add, Remove a Contains.

Naprogramujte si jednoduchý textový editor

Ako ukážku izolovaného úložiska by ste si mohli naprogramovať veľmi jednoduchý textový editor. Dajte si na formulár jeden viacriadkový TextBox (nastavte mu vlastnosť AcceptsReturn na True) a dve tlačítka - jedno pre uloženie dát a jedno pre ich načítanie.

<UserControl x:Class="CommunicationClient.Page"
    xmlns="http://schemas.microsoft.com/client/2007" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="400" Height="300">
    <Grid x:Name="LayoutRoot" Background="White">
        <Grid.RowDefinitions>
            <RowDefinition Height="25"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>
        <StackPanel Grid.Row="0" Orientation="Horizontal">
            <Button x:Name="SaveButton" Content="Uložiť" Click="SaveButton_Click"
                    Width="80" Background="LightCoral" Margin="2" />
            <Button x:Name="LoadButton" Content="Načítať" Click="LoadButton_Click"
                    Width="80" Background="LightCoral" Margin="2" />
        </StackPanel>
        <TextBox x:Name="EditorTextBox" AcceptsReturn="True" Grid.Row="1"
                 Margin="2" BorderThickness="2" Background="LightGoldenrodYellow"
                 FontFamily="Courier New" FontSize="12" />
    </Grid>
</UserControl>

Ukladanie dát

Keď užívateľ klikne na tlačítko Uložiť, vytvoríme súbor data.txt v aplikačnom izolovanom úložisku a obsah textového poľa do neho uložíme. Ešte pred tým však vykonáme kontrolu, či veľkosť dát, ktoré chceme zapísať nie je vačšia ako kapacita úložiska. Ak je, potom skúsime navýšiť aplikácii pridelenú kvótu na veľkosť dát plus 100 KB navyše ako nejakú rezervu. Na prácu s úložiskom použijeme objekt triedy IsolatedStorageFile a pomocou tohto objektu si vieme vytvoriť file, ktorý sa pre nás tvári ako bežný Stream - je to objekt typu IsolatedStorageFileStream.

private void SaveButton_Click(object sender, RoutedEventArgs e)
{
    IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication();
    bool canSave = true;
 
    if (storage.Quota < EditorTextBox.Text.Length)
    {
        long newSize = ((EditorTextBox.Text.Length / 1024) + 100) * 1024;
        canSave = storage.TryIncreaseQuotaTo(newSize);
    }
 
    if (canSave)
    {
        using (IsolatedStorageFileStream stream = storage.OpenFile("data.txt", FileMode.Create))
        {
            using (StreamWriter writer = new StreamWriter(stream))
            {
                writer.Write(EditorTextBox.Text);
                writer.Close();
            }
        }
    }
}

Načítanie dát

Načítanie dát je ešte jednoduchšie, pretože nepotrebujeme kontrolovať kvótu priestoru. Jediné, čo potrebujeme skontrolvoať je, či súbor na disku už existuje. Ak existuje, tak tento otvoríme a jeho obsah zapíšeme do textového poľa:

private void LoadButton_Click(object sender, RoutedEventArgs e)
{
    IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication();
 
    if (storage.FileExists("data.txt"))
    {
        using (IsolatedStorageFileStream stream = storage.OpenFile("data.txt", FileMode.Open))
        {
            using (StreamReader reader = new StreamReader(stream))
            {
                EditorTextBox.Text = reader.ReadToEnd();
            }
        }
    }
}

Záver

Izolované úložisko Vám príde vhod ak potrebujete na strane perzistovať dáta aj medzi jednotlivými spusteniami aplikácie. Ak potrebujete dáta len pre jedno spustenie aplikácie, použite triedu ApplicationSettings. Tak či onak, vždy dôkladne zvážte, či si nejaké dáta uložiť musíte, aby ste zbytočne neplýtvali prideleným miestom.

Mohlo by ťa tiež zaujímať

Páčil sa ti príspevok?

Zdieľaj príspevok alebo si ho odlož na neskôr

Sleduj ma

Ak nechceš premeškať príspevky ako je tento, sleduj ma na Twitteri, alebo ak máš RSS čítačku, môžeš sledovať môj RSS kanál.