Arbeide med lokale databaser på Windows Phone 8

I den forrige artikkelen lærte du hvordan du lagrer data i appens isolerte lagring. I denne artikkelen fokuserer vi på å jobbe med lokale databaser som lever i appens isolerte lagring. Du lærer om databaseoperasjoner ved hjelp av LINQ, databaseskjemaer, samt hvordan du henter data fra en lokal database.

1. Introduksjon

Du kan lagre relasjonsdata i en lokal databasesom lever i appens isolerte lagring. All database operasjoner på Windows Phone utføres ved hjelp av LINQ til SQL. Det brukes til å definere databaseskjemaet, velge data og lagre endringer i den underliggende databasefilen som er lokalisert i den lokale mappen. 

LINQ til SQL-objektmodellen bruker System.Data.Linq.DataContext namespace for å foreta et proxy-anrop til den lokale databasen. LINQ til SQL runtime fungerer som en bro mellom datakontekst objekt og ekte data å gjøre manipulasjoner.

Når du arbeider med lokale databaser på Windows Phone, er det viktig å holde følgende i bakhodet:

  • Den lokale databasen kjører i Windows Phone-appens prosess. Den kjører ikke kontinuerlig som bakgrunnstjeneste.
  • Den kan bare nås av den tilhørende Windows Phone-appen.
  • Det kan bare nås med LINQ til SQL, og Transact-SQL støttes ikke.
  • For å synkronisere tilgang til den lokale mappen over forskjellige tråder, vil mutex klassen er brukt.
  • Det anbefales ikke å kryptere referansebasefilen hvis du kommer til å få tilgang til den utelukkende fra installasjonsmappen. Dette gjør at systemet ikke utfører rutinemessig vedlikehold av databaser, for eksempel omregistrering, ved den første tilkoblingen.

Denne artikkelen viser hvordan du kan opprette en lokal database og sette inn, oppdatere eller slette data fra den. Vi vil bygge en prøveapplikasjon med en Brukerdetaljer bord og utfør ulike operasjoner på den. Vi vil adskille kodefilene for forskjellige operasjoner, for eksempel å sette inn, oppdatere og slette for enkelhets skyld. 

2. Bygg datakonteksten

Tabellene for databasen kan defineres hvor som helst i appen så lenge den er tilgjengelig globalt. Vi lager en egen fil, DB.cs, for alle bordene. I denne filen spesifiserer vi en objektmodell som bestemmer database skjema og opprett datakontekst.

Trinn 1: Legge til referanser

Legg til følgende direktiver øverst på siden DB.cs fil for å referere LINQ til SQL-montering:

bruker System.Data.Linq; bruker System.Data.Linq.Mapping;

Trinn 2: Opprette et bord

Legg til en entitetsklasse som heter User_details som representerer databasetabellen til appen i den lokale databasen. Attributtet [Bord] Indikerer LINQ til SQL runtime for å kartlegge klassen til en lokal database tabell.

[Tabell] offentlig klasse User_details [Kolonne (IsDbGenerated = true, IsPrimaryKey = true)] offentlig int ID get; sett;  [Kolonne] offentlig streng brukernavn get; sett;  [Kolonne] offentlig streng user_email get; sett; 

Som du kan se, er User_details klassen har tre offentlige egenskaper som tilsvarer tre databasekolonner:

  • ID er en identifikasjonskolonne som automatisk befolkes av databasen. Det er også den primære nøkkelen som en databaseindeks automatisk opprettes for. Disse innstillingene og mer er spesifisert med LINQ til SQL-kolonnekartingsattributtet som er skrevet over egenskaps syntaksen.
  • brukernavn er en kolonne for å lagre brukernavnet.
  • user_email er en kolonne for å lagre brukerens e-postadresse.

Trinn 1: Definere datakontekst

Klassen UserDataContext arver fra Datacontext og er referert til som datakontekst. Denne koden kaller basekonstruktøren og erklærer databastabellen navngitt User_details. Den lokale databasen er lagret i appens isolerte lagring, og i vårt eksempel lagres den som Databases.sdf

offentlig klasse UserDataContext: DataContext offentlig statisk streng DBConnectionString = @ "isostore: /Databases.sdf"; offentlig UserDataContext (string connectionString): base (connectionString)  offentlig tabell Brukere get return this.GetTable(); 

Vær oppmerksom på at databasetilkoblingsstrengen ikke er nødvendig for å være et statisk felt. Vi bruker DBConnectionString i dette tilfellet bare for enkelhets skyld.

3. Opprette databasen

For å opprette databasen, åpne koden bak fil av appen, oppkalt App.xaml.cs. Legg til følgende kode på slutten av konstruktøren, oppkalt app.

bruker (UserDataContext context = new UserDataContext (UserDataContext.DBConnectionString)) if (! context.databaseExists ()) context.CreateDatabase (); 

Databasenes opprettelseskode er lagt til her, slik at databasen vil være til stede før koden fra hovedsiden kjører. Koden sjekker om databasen eksisterer, og hvis ingen database er funnet, opprettes en ny.

4. Databaseoperasjoner

Når datakonteksten er bygget og databasen er opprettet, kan vi utføre operasjoner på den. Du kan sette inn, oppdatere og slette poster fra tabellen vi nettopp har opprettet. Vi har opprettet separate klasser for å holde funksjoner for å sette inn, slette og oppdatere operasjoner.

Trinn 1: Sette inn poster

Det er praktisk å lage en egen klassefil, DatabaseAdd.cs, for å legge til noen poster i databasen. Definer en funksjon adduser det tar Navn og epost id som parametere og legger til en post til User_details bord.

offentlig ugyldig AddUser (Strenge navn, String email) bruker (UserDataContext context = nytt UserDataContext (UserDataContext.DBConnectionString)) User_details du = new User_details (); du.user_name = navn; du.user_email = email; context.Users.InsertOnSubmit (du); context.SubmitChanges (); 

De adduser funksjonen brukerUserDataContext datakontekst for å koble til databasen, oppretter en ny forekomst av User_details enhetsklasse, og legger inn en post.

Nye elementer som er lagt til i datakonteksten, blir ikke lagret i databasen til SubmitChanges funksjon kalles. Ring adduser funksjon for å legge til en post i databasen.

DatabaseAdd add = ny DatabaseAdd (); add.AddUser ( "vivek", "[email protected]");

Trinn 2: Henter poster

Lag en egen klassefil, FetchDatabase.cs, for å hente poster fra databasen. Denne klassen inneholder en GetAllUsers funksjon som returnerer en IList eksempel, som inneholder postene hentet fra bordet.

Tilkoblingen settes opp ved hjelp av datakonteksten etter hvilke poster hentes fra User_details bord. LINQ-spørringen returnerer en IList forekomst som inneholder de hentede postene. De IList forekomsten er ikke noe mer enn en samling gjenstander av samme type.

offentlig IList GetAllUsers () IList liste = null; bruker (UserDataContext context = nytt UserDataContext (UserDataContext.DBConnectionString)) IQueryable query = fra c i context.Users velger c; list = query.ToList ();  returliste; 

I koden nedenfor definerer vi en brukere klasse med data medlemmer id, Navn, og e-post å holde detaljene fra de hentede postene.

klassen brukere offentlig streng id get; sett;  offentlig strengnavn get; sett;  offentlig streng e-post get; sett; 

Opprett en annen funksjon, getAllUsers, som returnerer en liste over brukere når kalt. Funksjonen oppretter en ny liste for å holde detaljene for de hentede brukerne. Det iterates gjennom IList forekomst heter usrs og legger til detaljer for hver bruker til alle brukere forekomst.

offentlig liste getUsers () IList usrs = this.GetAllUsers (); Liste allUsers = ny liste(); foreach (User_details m in usrs) Users n = new Users (); n.id = m.ID.ToString (); n.name = m.user_name; n.email = m.user_email; allUsers.Add (n);  returnere alle brukere 

I eksemplet søknaden av denne artikkelen, den getUsers funksjonen brukes til å stille inn ItemSource av listeboksen oppkalt alle brukere som vist under.

FetchDatabase fetch = new FetchDatabase (); allusers.ItemsSource = fetch.getUsers ();

Trinn 3: Oppdatering av poster

Oppdatering av poster ligner veldig på å legge til poster i et bord. Fortsetter med vår modulære tilnærming, oppretter vi en ny klassefil, DatabaseUpdate.cs, for databaseoppdateringer. I motsetning til slette operasjoner, er det ingen funksjon å oppdatere flere poster samtidig.

Legg til en funksjon UpdateUsers som aksepterer en id, Navn, og epost id, og oppdaterer tabellraden for den tilsvarende id.

public void UpdateUser (int id, String email, String navn) using (UserDataContext context = new UserDataContext (UserDataContext.DBConnectionString)) IQueryable entityQuery = fra c i context.Users hvor c.ID == id velg c; User_details entityToUpdate = entityQuery.FirstOrDefault (); entityToUpdate.user_name = navn; entityToUpdate.user_email = email; context.SubmitChanges (); 

Funksjonen spørrer databasen og lagrer den første samsvarende posten i entityToUpdate variabel. Den oppdaterer deretter posten ved å tilordne de nye verdiene og sender endringene for å oppdatere databasen.

Databasen er ikke oppdatert før vi ringer til SubmitChanges funksjon. Denne funksjonen oppdaterer bare den første samsvarende posten. De UpdateUser funksjon kalles for å oppdatere eksisterende poster i databasen som vist nedenfor.

DatabaseUpdate update = ny DatabaseUpdate (); update.UpdateUser (1, "[email protected]", "vivek.maskara");

Hvis du vil oppdatere flere poster, må du iterere gjennom postene du vil oppdatere en etter en. I den følgende kodestykket oppdaterer vi navnet på hver bruk i databasen ved å gjøre den små bokstaver.

bruker (UserDataContext context = nytt UserDataContext (UserDataContext.DBConnectionString)) IQueryable entityQuery = fra c i context.Users velger c; IList entityToUpdate = entityQuery.ToList (); foreach (User_details bruker i entityToUpdate) user.user_name = user.user_name.ToLower ();  context.SubmitChanges (); 

Trinn 4: Slette poster

Lag en klassefil, DatabaseDelete.cs ,for slette operasjoner. I DatabaseDelete klasse, legg til en DeleteUser funksjon som aksepterer en parameter id og sletter en enkelt bruker hvis id samsvarer med innleveringsparameteren.

offentlig ugyldig Slett bruker (String id) // Slett bruker etter ID bruker (UserDataContext context = nytt UserDataContext (UserDataContext.DBConnectionString)) IQueryable entityQuery = fra c i context.Users hvor c.ID.Equals (id) velg c; User_details entityToDelete = entityQuery.FirstOrDefault (); context.Users.DeleteOnSubmit (entityToDelete); context.SubmitChanges (); 

Funksjonen ringer DeleteOnSubmit, som sletter en enkelt post fra databasen. Endringene lagres når SubmitChanges funksjon kalles. De DeleteUser funksjon sletter en enkelt post fra databasen som vist nedenfor.

DatabaseDelete delete = new DatabaseDelete (); delete.DeleteUser ( "1");

De System.Data.Linq montering gir en funksjon DeleteAllOnSubmit for å slette flere poster samtidig. Følgende kodestykke avkortes User_details bord.

bruker (UserDataContext context = nytt UserDataContext (UserDataContext.DBConnectionString)) IQueryable entityQuery = fra c i context.Users velger c; IList entityToDelete = entityQuery.ToList (); context.Users.DeleteAllOnSubmit (entityToDelete); context.SubmitChanges (); 

Denne funksjonen godtar en liste over poster og sletter postene i listen. Merk at i begge tilfeller blir endringene bare lagret når SubmitChanges funksjon kalles.

Konklusjon

Windows Phone apps bruker LINQ til SQL for all database operasjoner. LINQ til SQL brukes til å definere databaseskjemaet, velge data og lagre endringer i den underliggende databasefilen som ligger i appens isolerte lagring. LINQ til SQL gir en objektorientert tilnærming for å jobbe med data lagret i en database og består av en objektmodell og en runtime. Jeg anbefaler at du leser denne MSDN-artikkelen for beste praksis med bruk av lokale databaser. Du er velkommen til å laste ned opplærings kildefiler for å bruke som referanse.