TOPlist

Programujeme pro WP: Používáme SQL CE ve Windows Phone 7.5

Na SmartManii se aktivně věnujeme článkům o programování pro Windows Phone. V tomto se podíváme jak ukládat data aplikace prostřednictvím databázové služby SQL CE 3.5.

Velice často se ve vaší Windows Phone aplikaci může naskytnout potřeba někam a nějak ukládat data. Ale který způsob je pro vás nejvýhodnější? Pokud ukládáte velké množství strukturovaných dat, uvažujte o využití integrované lokální databázové služby SQL CE 3.5. V tomto seriálu vás provedeme základy při tvorbě takové databáze a ukážeme si její praktické využití.

Databázi můžete samozřejmě využít i ve svém stávajícím projektu, ale z praktických důvodů si ukážeme její aplikaci na projektu novém. Vytvoříme si projekt s databází zboží ve fiktivním obchodě, přičemž každé zboží bude mít nadefinováno svého výrobce, distributora, cenu a gramáž, případně i slevu.

Budujeme databázi základy

Prvním krokem je samozřejmě vytvoření projektu – nazvěme ho třeba ObchodSCernymZbozim. Vytvořte ho nejlépe jako Windows Phone Pivot Application.

K tomuto projektu je třeba přidat jisté komponenty – konkrétně System.Data.Linq. To provedete v menu Project aAdd Reference…, kde vyberete ze seznamu System.Data.Linq a potvrdíte OK.

Nyní nám již nic nebrání v tvorbě modelů, databázových tabulek a samotné databáze.

Tvorba třídy pro použití v databázi

Základní implementace třídy zboží by mohla vypadat asi takto. Klidně improvizujte a zkuste si do třídy přidat i něco dalšího, základní datové typy (string, int, double, float apod.) by měly projít hladce:

public class Zbozi 
    { 
        // Některé základní vnitřní proměnné. Nejedná se ještě o sloupce tabulky. 
        private int id; 
        private string nazev; 
        private string vyrobce; 
        private string distributor; 
        private double cena; 
        private double vaha; 
        private double slevaProcent; 
        private double mnozstviNaSklade;

        public int ID 
        { 
            get { return id; } 
            set 
            { 
                id = value; 
            } 
        }

        public string Nazev 
        { 
            get { return nazev; } 
            set { nazev = value; } 
        } 
        public string Vyrobce 
        { 
            get { return vyrobce; } 
            set { vyrobce = value; } 
        } 
        public string Distributor 
        { 
            get { return distributor; } 
            set { distributor = value; } 
        } 
        public double Cena 
        { 
            get { return cena; } 
            set { cena = value; } 
        } 
        public double SlevaProcent 
        { 
            get { return slevaProcent; } 
            set { slevaProcent = value; } 
        } 
        public double Vaha 
        { 
            get { return vaha; } 
            set { vaha = value; } 
        } 
        public double MnozstviNaSklade 
        { 
            get { return mnozstviNaSklade; } 
            set { mnozstviNaSklade = value; } 
        }

    }

Nyní si do souboru se třídou přidáme na začátek několik používaných jmenných prostorů:

using System.Data.Linq; 
using System.Data.Linq.Mapping;

A můžeme se pustit do definice tabulky k této třídě. Přidejte třídě Zbozi atribut [Table].

[Table] 
public class Zbozi 
{…}

Každá instance této třídy se od této chvíle bude chovat po přidání do tabulky jako jeden její řádek. Nemáme ovšem nadefinované sloupce této tabulky. Je třeba to napravit.

Veřejným vlastnostem této třídy přidejte atribut [Column] – neboli sloupec. U ID bude mít Column trochu více parametrů, vysvětlíme si je níže:

[Column(IsPrimaryKey=true, CanBeNull=false, IsDbGenerated=true, AutoSync=AutoSync.OnInsert)] 
public int ID {…}

[Column] 
public string Nazev {…}

[Column] 
public string Vyrobce {…}

[Column] 
public string Distributor {…}

[Column] 
public double Cena {…}

[Column] 
public double SlevaProcent {…}

[Column] 
public double Vaha {…}

Samotný atribut [Column()] zajistí, že vybraná proměnná nebo vlastnost bude posuzována jako sloupec tabulky. Ovšem k čemu jsme potřebovali další parametry u ID?

· IsPrimaryKey: značí, zda tento sloupec obsahuje primární klíč, což je jedinečný identifikátor položky v databázi. Každá tabulka, pokud má za něco stát, by jej měla mít.

· CanBeNull: může sloupec nabývat hodnoty null? Pokud ano, true. Pokud ne, false. U primárního klíče je nezbytné, aby nullový nebyl, proto false.

· IsDbGenerated: značí, zda je hodnota sloupce generována databází. Je výhodné nechat primární klíč generovaný databázovým systémem, abyste se o něj nemuseli starat při vkládání dalších řádků do tabulky.

· AutoSync=AutoSync.OnInsert: značí, že po vložení instance (řádku) do tabulky se automaticky zaktualizuje příslušný sloupec v instanci. V našem případě to je ID. Toto je velmi užitečné právě u primárního klíče, kdy po vložení okamžitě získáte ID a můžete s ním dále pracovat.

O dalších parametrech (Name, Storage, Type aj.) si povíme později, zatím je nepotřebujeme. Každý však má své specifické použití v jistých situacích.

Spojovací kanál k databázi – DataContext

Máme založený projekt a máme v něm novou tabulku, ještě nám ovšem chybí připojení k databázi. To se realizuje odvozením třídy DataContext, kterou zneužijeme pro své účely. A její tvorba je až překvapivě snadná.

Vytvořte si v projektu nový soubor – třídu – ObchodDataContext.cs. Přidáme jí používaný jmenný prostor:

using System.Data.Linq;
using System.Data.Linq.Mapping;

A poté přidáme předka – DataContext – a konstruktor. Budeme využívat pohostinnosti předka a zneužijeme jeho konstruktor; ten náš odvodíme od jeho (konstruktoru) a předáme mu rovnou tzv. connection string neboli připojovací řetězec – tímto se databázový engine dozví, k jakému souboru se má připojit.

public class ObchodDataContext : DataContext 
    { 
        public ObchodDataContext() 
            : base("isostore:/obchodData.sdf") 
        { 
        } 
    }

Isostore:/ značí, že se soubor uloží do tzv. Isolated Storage, což je prostor, do kterého si aplikace může ukládat svá data.

Tak a máme připojovací třídu, ve které nám chybí tabulky. Jediný řádek přidaný do třídy to pomůže napravit.

public Table<Zbozi> Zbozi;

To je vše. J Vnitřní magie nyní zajistí, že po vytvoření instance třídy ObchodDataContext a připojení k databázi se automaticky vytvoří nová tabulka Zbozi této databáze.

Co dál?

V tomto díle jsme si ukázali, jak snadno a rychle vytvořit kostru jednoduché databáze. Příští týden databázi skutečně založíme, vložíme do ní nějaká data a pokusíme se je různými způsoby vyfiltrovat, vypsat a zobrazit v seznamu (proto jsme vytvořili aplikaci s Pivotem). Pokud budete mít k článku nějaké dotazy, využijte prostoru v komentářích.

Autor článku Paulos
Paulos

Kapitoly článku