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.
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:
mutex
klassen er brukt.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.
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.
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;
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.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 tabellBrukere 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.
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.
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.
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]");
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 IListGetAllUsers () 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 listegetUsers () 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 ();
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)) IQueryableentityQuery = 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)) IQueryableentityQuery = 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 ();
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)) IQueryableentityQuery = 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)) IQueryableentityQuery = 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.
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.