Sledujte nás na YouTube

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.

Paulos

10 komentářů

  1. BEZY (neregistrovaný)

    Trochu mě fascinuje, že v celém článku není nikde napsáno, že daná technologie se jmenuje LINQ to SQL. Taky psát tohle ručně je pro projekty s více než 2 tabulkami neudržitelný, lepší je použít OR Designera, viz např. [odkaz] (neříkám že je to optimální řešení, je to taky celkem opruz, ale lepší než tabulky a vazby psát ručně)

    • Paulos (neregistrovaný)

      S LINQ-to-SQL máš pravdu, přitom jsem to v jedné z předchozích verzí článku měl, zmíním to v dalším díle. Stejně tak je podle mě lepší, když si člověk aspoň jednou ty věci napíše sám, pak už klidně můžeme využít nástrojů jako např. ten zmiňovaný designer.

    • phoenix100 (neregistrovaný)

      Technologie se jmenuje Entity framework a je to zobecneni LINQ to SQL. Vytvareni DB objektu pomoci odekorovanych trid (Code First) je plnohodnotny ekvivalent ke kresleni modelu v designeru a rozhodne si nemyslim ze je psani neudrzitelne. Naopak umoznuje to vyvojari napsat si datove tridy tak jak je vyuzije v aplikaci a popsat zpusob serializace a pote se nemusi starat o to jak si s nimi databaze poradi.

    • Mishpuleen (neregistrovaný)

      LINQ to SQL jako takový byl dřív než Entity Framework, který je navíc mnohem komplexnější… ;)

    • BEZY (neregistrovaný)

      LINQ to SQL nemá s EF nic společného. To o čem mluvíš je LINQ to Entities.

    • Paulos (neregistrovaný)

      Dovolím si ještě upozornit Bezyho, že O/R Designer, resp. typ souboru „Linq To SQL Classes“ není dostupný v projektech pro Windows Phone 7. Ale ani tak by neměl být problém nejprve třídy navrhnout v nějakém Windows Forms projektu a poté jejich kód přenést, neboť se zde zjevně nepoužívá nic, co by nebylo v projektu pro WP7 dostupné.

      Já mám ovšem rád svůj kód a u něj zůstanu. :-)

    • BEZY (neregistrovaný)

      Jasně, však ten link kterej sem přihodil přesně tenhle postup popisuje :) A taky jej takhle používám. Doufám že v budoucnu už Designer bude dostupný pro WP7 přímo :)

    • Paulos (neregistrovaný)

      Hups. :) Máš pravdu, nebyl jsem dostatečně pozorný při přelítávání článku očima.

  2. aerkain (neregistrovaný)

    Dobry uvod. Diky. Doufam ze se mira vnitrni magie bude postupem casu zmensovat.

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *