Kezdőoldal > .NET, Windows Phone 7 > Read-Only adatbázis létrehozása

Read-Only adatbázis létrehozása

2012. május 7. hétfő Hozzászólás Go to comments

Bár elég egyszerű létrehozni adatbázist úgy, hogy van egy entitás osztályunk és egy DataContext példányunk, mégis egy bonyolultabb adatbázis szerkezetének létrehozása sok munkával járhat, különösen, ha nagyon sok táblánk van, és a táblák között kapcsolatok is vannak. Nemcsak létre tudunk hozni adatbázist, arra is van lehetőségünk, hogy már meglévő adatbázist (sdf) hozzáadjunk a projekthez és kezeljük azt. Nézzük meg ezt az esetet lépésről lépésre! A célunk tehát az, hogy létrehozzunk egy SQL Server CE adatbázist, előállítsuk hozzá az entitás osztályokat és a DataContextet, majd felhasználjuk egy WP7 alkalmazásban.

1. Indítsuk el az SQL Server Mangement Studio 2008 Express változatát (ha ez az alkalmazás nincs meg, akkor legegyszerűbben a Web Platform Installer-rel telepíthetjük fel)!

2. Indítás után egy Login képernyő fogad. Itt a Server type-nál válasszuk az SQL Server Compact –ot!

image

3. A Database file-nál válasszuk a <New Database…> menüpontot, ekkor felugrik a Create New SQL Server Compact Database ablak. A fájl neve ebben az esetben a D meghajtó TestDb mappájára mutat, ebben a mappában fogja a MyMusic.sdf adatbázist létrehozni a Management Studio.

image

Most nem foglalkozunk a titkosítással, így az Encryption mode maradhat UNENCRYPTED. Ezt követően kattintsunk az OK gombra! Ugyan most kapunk egy figyelmeztetést, hogy az adatbázisunk nem lesz levédve, de ezzel most ne törődjünk, és kattintsunk a Yes gombra! A későbbiek folyamán a titkosítással is fogunk foglalkozni.

4. Ezt követően visszaugrunk a Connect To Server ablakhoz, itt kattintsunk a Connect gombra, ekkor az SQL Server Management Studio-ból kezelhetjük ezt az adatbázist.

5. Az Object Explorer-ben kattintsunk a Tables elemre jobb egérgombbal, majd a megjelenő helyi menüben válasszuk ki a New Table menüpontot!

6. A megjelenő New Table ablakban definiáljuk a Musics adattáblát. Az ID oszlop egy int típusú elsődleges kulcs, True értékre állított Identity tulajdonsággal és annak alapértelmezett értékeivel. Az Artist és a Title mezők nvarchar típusúak, a Rating mező int típusú. Kattintsunk az OK gombra!

image

7. Most már elkészült az adatbázisunk, bezárhatjuk az SQL Server Management Studio-t. Az adatbázist Windows Phone alól viszont csak Linq To SQL-lel érhetjük el. Ehhez létre kell hoznunk az entitásokat reprezentáló osztályokat. Persze itt is megtehetnénk, hogy kézzel generáljuk az entitás osztályokat és a DataContextet, de van szerencsére egy SQLMetal nevezetű eszköz is, ami bár hivatalosan még mindig nem támogatott eszköz, a Windows Phone 7 fejlesztés során mégis nagy hasznát tudjuk venni.

8. Indítsuk el a Visual Studio 2010 Command prompt-ot!

9. A Command Prompt-ban az egyszerűség kedvéért navigáljunk el abba a mappába, ahol az adatbázist elkészítettük (ez jelen esetben a D:\TestDb mappa), majd indítsuk el az SqlMetal.exe alkalmazást az alábbi paraméterekkel:

sqlmetal MyMusic.sdf /code:MyMusic

Ebben az esetben a MyMusic.sdf-ből készítünk MyMusic.cs fájlt. A forrásfájlban lesznek az entitásosztályaink, valamint a DataContext is. Ez a forrásfájl jelenleg az adatbázis mellett található.

image

10. Most már kész az adatbázisunk és a hozzá tartozó osztályok is elkészültek. Itt az ideje használatba venni ezeket: indítsuk el a Visual Studio-t, és készítsünk egy új Windows Phone Application projektet (legyen a neve DatabaseSample)!

11. Amint elkészült az alkalmazás sablonja, adjuk hozzá az adatbázist és az SqlMetal által generált forrásfájlt! Ehhez a Solution Explorer-en kattintsunk jobb egérgombbal, majd a megjelenő helyi menüben válasszuk ki az Add Existing Item menüpontot, és válasszuk ki a fentebb említett fájlokat!

12. Adjuk hozzá a projekthez a System.Data.Linq assembly-t is! Kattintsunk jobb egérgombbal a References-re a Solution Explorerben, és válasszuk ki az Add Reference menüpontot!

13. A megjelenő ablakban kattintsunk a .Net fülre, és válasszuk ki a System.Data.Linq névteret!

14. Ezt követően, ha megpróbálnánk lefordítani az alkalmazást, a következő hibaüzenetet kapnánk:

The type or namespace name ‘IDbConnection’ does not exist in the namespace ‘System.Data’ (are you missing an assembly reference?)

15. Ez azért van, mert a Windows Phone 7 System.Data névterében valóban nem létezik IDbConnection, az SqlMetal viszont legenerálta azt. Mint korábban is említettük, az SqlMetal nem generál teljesen kompatibilis kódot a Windows Phone 7-tel, hivatalosan nem is támogatott eszköz, mégis megkönnyíti a fejlesztést. Ahhoz, hogy ez a DataContext helyes legyen, alakítsuk át a két konstruktort az alábbi módon:

public MyMusic(System.Data.IDbConnection connection) :

    base(connection, mappingSource)

{

    OnCreated();

}

 

public MyMusic(System.Data.IDbConnection connection, System.Data.Linq.Mapping.MappingSource mappingSource) :

    base(connection, mappingSource)

{

    OnCreated();

}

Ettől a ponttól kezdve már használatba vehetjük az adatbázist. Igen ám, de ha megpróbálnánk elérni azt, akkor az alábbihoz hasonló hibát kapnánk:

MyMusic db = new MyMusic("isostore:/MyMusic.sdf");

image

16. Ezt a hibát azért kapjuk, mert az IsolatedStorage-ban nem szerepel ez az adatbázis. Bár Content-re van állítva az adatbázis Build Action tulajdonsága, és az XAP-ban is benne van ez az adatbázis, mégsem található az Isolated Storage-ban. Ahhoz, hogy ezt az adatbázist használjuk (Reference Database), egy speciális connection string-et kell megadnunk:

MyMusic db = new MyMusic("Data Source = ‘appdata:/MyMusic.sdf’; File Mode = read only");

17. Az adatbázist most már elérhetjük, de csak lekérdezéseket fogalmazhatunk meg rajta, azaz csak olvasható az adatbázis tartalma. Amint módosítani szeretnénk, azonnal egy Permission Denied hibaüzenetet kapnánk. (Az adatok módosításáról és hozzáadásáról a következő alfejezetben olvashatunk)

image

18. Ahhoz, hogy ezt elkerüljük, az adatbázist át kell másolnunk az Isolated Storage-ba. Ehhez használhatjuk például az alábbi segédmetódust:

public class DatabaseHelper

{

    public static void MoveReferenceDatabase()

    {

        IsolatedStorageFile iso = IsolatedStorageFile.GetUserStoreForApplication();

 

        using (Stream input = Application.GetResourceStream(new Uri("MyMusic.sdf",

            UriKind.Relative)).Stream)

        {

            using (IsolatedStorageFileStream output = iso.CreateFile("MyMusic.sdf"))

            {

                byte[] readBuffer = new byte[4096];

                int bytesRead = -1;

                while ((bytesRead = input.Read(readBuffer, 0, readBuffer.Length)) > 0)

                {

                    output.Write(readBuffer, 0, bytesRead);

                }

            }

        }

    }

}

19. Amint meghívjuk a MoveReferenceDatabase metódust, az átmásolja az adatbázist az Isolated Storage-ba, és ezek után a megszokott módon tudjuk lekérdezni, módosítani az adatbázis tartalmát. Ne felejtsük el, hogy ebben az esetben a connection string-et a hagyományos isostore értékre kell visszaállítanunk:

MyMusic db = new MyMusic("isostore:/MyMusic.sdf");

Láthattuk, hogy milyen lépéseket kell megtennünk ahhoz, hogy már meglévő adatbázist használjunk fel a Windows Phone 7 készülékünkön. Bár ez a módszer nem teljesen támogatott, mégis nagyon sokszor hasznos lehet. Ha csak olvasható adatbázist akarunk használni, akkor egyszerűen csak hozzáadjuk az adatbázist, és az legenerál egy forrásfájlt a projektünkhöz, ha azonban módosítani is szeretnénk, akkor egy segédmetódust is definiálnunk kell az adatbázis mozgatásához.

Az adatbázisunk még üres, ezt követően töltsük fel adatokkal!

Advertisements
Kategóriák:.NET, Windows Phone 7 Címke: , ,
  1. 2012. május 8. kedd - 11:30

    Egy “furcsa” kérdés. Tehát – korábbi projectemben ment az ügy, még 5-ös mobile windows-os időkben – pc oldalon megkreáltuk az uszkve 500 MB-os sdf-et, letoltuk a pda-ra (mert és minek utána az 500 MB-os SDF létrehozása, akár szinkronizálás akár helyben kreálás – web service-ből leszedett adatokból – kivárhatatlan volt). Értsd file másolás.
    No most ezt ugye WP7 időkben nem megy. Te ilyent hogy oldanál meg?
    Valami web/wcf service file download szeletekben?
    (még ugyen nem láttam ipari wp7-et 🙂 leejthetőt, vonalkódolvasósat, stb., de készülni kell a jövendőre )

  2. 2012. május 9. szerda - 14:02

    A kérdés nagyon jó. Sajnos (vagy pont, hogy nem) ekkora méretű db fájl nem szerepelhet az XAP-ban. AZ XAP ugyanis maximum 225 megabyte lehet. Nem beszélve arról, hogy ha MoveDB-t készítünk az se egy gyors folyamat. Webservice lekérések persze játszhatnak de azok se túl gyorsak.

    Amit használni szoktak. PL navigációknál. Az alap alkalmazás viszonylag kicsi, majd az első indulásánál szólunk, hogy töltse le az X méretű féjlt. (Ez akár mehet háttérben is) Lásd Noika Drive. Jobb megoldás jelenleg nincs sajnos. (Vagy én nem ismerek) – Utóbbinak is van hátulütője, ugyanis frissítéskor megintcsak le kel tölteni a fájlt.

  1. No trackbacks yet.

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s

%d blogger ezt kedveli: