Lucrul cu baze de date locale pe Windows Phone 8

În articolul precedent, ați învățat cum să stocați date în spațiul de stocare izolat al aplicației. În acest articol, ne concentrăm pe lucrul cu bazele de date locale care trăiesc în spațiul de stocare izolat al aplicației. Veți învăța despre operațiile bazei de date utilizând LINQ, schemele bazei de date, precum și modul de preluare a datelor dintr-o bază de date locală.

1. Introducere

Puteți stoca date relaționale într-o bază de date localăcare trăiește în spațiul de stocare izolat al aplicației. Toate operațiile bazei de date pe Windows Phone sunt realizate folosind LINQ to SQL. Se utilizează pentru a defini schema bazei de date, a selecta date și a salva modificările fișierului bază de date care se află în dosarul local. 

Modelul obiect LINQ la SQL utilizează System.Data.Linq.DataContext spațiu de nume pentru a efectua un apel proxy către baza de date locală. LINQ to runtime SQL acționează ca o punte între contextul de date obiect și date reale să facă manipulări.

Când lucrați cu baze de date locale pe Windows Phone, este important să țineți cont de următoarele:

  • Baza de date locală rulează în procesul aplicației Windows Phone. Nu rulează continuu ca serviciu de fundal.
  • Acesta poate fi accesat numai de aplicația Windows Phone corespunzătoare.
  • Acesta poate fi accesat numai cu LINQ la SQL, Transact-SQL nu este acceptat.
  • Pentru a sincroniza accesul la dosarul local prin fire diferite, mutex clasa este utilizată.
  • Nu este recomandat să criptați fișierul bazei de date de referință dacă îl accesați exclusiv din dosarul de instalare. Acest lucru împiedică sistemul să efectueze operații de întreținere a bazei de date de rutină, cum ar fi re-indexarea, la prima conexiune.

Acest articol arată cum puteți să creați o bază de date locală și să inserați, să actualizați sau să ștergeți date din aceasta. Vom construi o aplicație de probă cu un Detalii utilizator tabel și efectuați diverse operații pe acesta. Vom separa fișierele de cod pentru diferite operații, cum ar fi inserarea, actualizarea și ștergerea din motive de conveniență. 

2. Construirea contextului de date

Tabelele pentru baza de date pot fi definite oriunde în aplicație, atâta timp cât acestea sunt accesibile la nivel global. Creăm un fișier separat, DB.cs, pentru toate mesele. În acest fișier specificăm un model de obiect care determină schema bazei de date și creați contextul de date.

Pasul 1: Adăugarea de referințe

Adăugați următoarele directive în partea de sus a paginii DB.cs fișier la referință LINQ la asamblare SQL:

utilizând System.Data.Linq; utilizând System.Data.Linq.Mapping;

Pasul 2: Crearea unei tabele

Adăugați o clasă de entități numită User_details care reprezintă tabelul bazei de date a aplicației din baza de date locală. Atributul [Masa] indică LINQ-ul pentru a rula SQL pentru a muta clasa într-o tabelă de baze de date locale.

[Table] clasa publică User_details [Column (IsDbGenerated = true, IsPrimaryKey = true)] public int ID get; a stabilit;  [Coloană] șir public nume utilizator get; a stabilit;  [Coloana] șir public user_email get; a stabilit; 

După cum puteți vedea, User_details clasa are trei proprietăți publice care corespund la trei coloane de bază de date:

  • ID-ul este o coloană de identificator care este populată automat de baza de date. Este, de asemenea, cheia primară pentru care este creat automat un index al bazei de date. Aceste setări și mai multe sunt specificate cu atributul mapare coloană LINQ la SQL scris deasupra sintaxei proprietății.
  • nume de utilizator este o coloană pentru a stoca numele utilizatorului.
  • USER_EMAIL este o coloană pentru a stoca adresa de e-mail a utilizatorului.

Pasul 1: Definirea contextului de date

Clasa UserDataContext moștenește de la DataContext și este denumită contextul de date. Acest cod apelează constructorul de bază și declară tabela bazei de date numită User_details. Baza de date locală este stocată în spațiul de stocare izolat al aplicației și în exemplul nostru este salvat ca Databases.sdf

clasa publică UserDataContext: DataContext șir static public DBConnectionString = @ "isostore: /Databases.sdf"; public UserDataContext (string connectionString): bază (connectionString)  tabel public Utilizatorii get return this.GetTable(); 

Rețineți că șirul de conectare a bazei de date nu este necesar să fie un câmp static. Folosim DBConnectionString în acest caz doar pentru confort.

3. Crearea bazei de date

Pentru a crea baza de date, deschideți codul din spatele fișierului aplicației, numit App.xaml.cs. Adăugați următorul cod la sfârșitul constructorului, numit App.

folosind (UserDataContext context = nou UserDataContext (UserDataContext.DBConnectionString)) if (! context.DatabaseExists ()) context.CreateDatabase (); 

Codul de creare a bazei de date este adăugat aici, astfel încât baza de date să fie prezentă înainte ca codul să se execute din pagina principală. Codul verifică existența bazei de date și, dacă nu există o bază de date, se creează o bază de date nouă.

4. Operațiuni baze de date

Odată ce contextul de date a fost construit și baza de date a fost creată, putem efectua operațiuni pe acesta. Puteți introduce, actualiza și șterge înregistrări din tabelul pe care tocmai l-am creat. Am creat clase separate pentru a ține funcții pentru operațiile de inserare, ștergere și actualizare.

Pasul 1: Inserarea de înregistrări

Este convenabil să creați un fișier de clasă separat, DatabaseAdd.cs, pentru adăugarea oricăror înregistrări în baza de date. Definiți o funcție Adăugați utilizator care ia Nume și EMAIL_ID ca parametri și adaugă o înregistrare la User_details masa.

public void AddUser (Nume șir, E-mail de șir) folosind (UserDataContext context = nou UserDataContext (UserDataContext.DBConnectionString)) User_details du = new User_details (); du.user_name = nume; du.user_email = email; context.Users.InsertOnSubmit (du); context.SubmitChanges (); 

Adăugați utilizator funcția utilizeazăUserDataContext context de date pentru a vă conecta la baza de date, creează o nouă instanță a User_details entitate și introduce o înregistrare.

Elementele noi care au fost adăugate în contextul de date nu sunt salvate în baza de date până la Trimite schimbări se numește funcția. Suna Adăugați utilizator pentru a adăuga o înregistrare în baza de date.

Baza de dateAdăugați add = new DatabaseAdd (); add.AddUser ( "vivek", "[email protected]");

Pasul 2: Încărcarea înregistrărilor

Creați un fișier de clasă separat, FetchDatabase.cs, pentru preluarea înregistrărilor din baza de date. Această clasă conține a GetAllUsers funcție care returnează o IList exemplu, conținând înregistrările extrase din tabel.

Conexiunea este configurată utilizând contextul de date după care sunt extrase înregistrările din User_details masa. Întrebarea LINQ returnează un mesaj IList instanță conținând înregistrările preluate. IList exemplu nu este altceva decât o colecție de obiecte de același tip.

public IList GetAllUsers () IList list = null; folosind (UserDataContext context = nou UserDataContext (UserDataContext.DBConnectionString)) IQueryable interogare = de la c în context.Users selectați c; list = query.ToList ();  listă de returnare; 

În fragmentul de cod de mai jos definim a Utilizatori clasa cu membrii de date id, Nume, și e-mail pentru a ține detaliile din înregistrările preluate.

utilizatori de clasă public string id get; a stabilit;  numele șirului public get; a stabilit;  șir de e-mail public get; a stabilit; 

Creați o altă funcție, getAllUsers, care returnează o listă de Utilizatori când este chemat. Funcția creează o listă nouă pentru a ține detaliile utilizatorilor preluați. Se iterează prin IList instanță numită usrs și adaugă detaliile fiecărui utilizator la toți utilizatorii instanță.

Lista publică getUsers () IList usrs = this.GetAllUsers (); Listă allUsers = Listă nouă(); foreach (User_details m în usrs) Utilizatori n = noi Utilizatori (); n.id = m.ID.ToString (); n.name = m.user_name; n.email = m.user_email; allUsers.Add (n);  return allUsers; 

În exemplul de aplicare a acestui articol, getUsers funcția este utilizată pentru a seta ItemSource din listbox numit toți utilizatorii așa cum se arată mai jos.

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

Pasul 3: Actualizarea înregistrărilor

Actualizarea înregistrărilor este foarte asemănătoare cu adăugarea de înregistrări la un tabel. Continuând cu abordarea noastră modulară, vom crea un nou fișier de clasă, DatabaseUpdate.cs, pentru actualizările bazei de date. Spre deosebire de operațiile de ștergere, nu există nicio funcție de actualizare a mai multor înregistrări simultan.

Adăugați o funcție UpdateUsers care acceptă o id, Nume, și EMAIL_ID, și actualizează rândul de tabel pentru suma corespunzătoare id.

public void UpdateUser (int id, String email, String name) folosind (UserDataContext context = nou UserDataContext (UserDataContext.DBConnectionString)) IQueryable entityQuery = de la c în context.Users unde c.ID == id selectați c; User_details entitToUpdate = entitateQuery.FirstOrDefault (); entityToUpdate.user_name = nume; entityToUpdate.user_email = email; context.SubmitChanges (); 

Funcția interoghează baza de date și stochează prima înregistrare potrivită în entityToUpdate variabil. Apoi actualizează înregistrarea atribuind noile valori și transmite modificările pentru a actualiza baza de date.

Baza de date nu este actualizată până când nu sunăm Trimite schimbări funcţie. Această funcție va actualiza numai prima înregistrare potrivită. UpdateUser este apelată pentru a actualiza înregistrările existente în baza de date, după cum se arată mai jos.

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

Pentru a actualiza mai multe înregistrări, va trebui să iterați prin înregistrările pe care doriți să le actualizați unul câte unul. În următorul fragment de cod, actualizăm numele fiecărei utilizări din baza de date, făcându-l în litere mici.

folosind (UserDataContext context = nou UserDataContext (UserDataContext.DBConnectionString)) IQueryable entityQuery = de la c în context.Users selectați c; IList entityToUpdate = entitateQuery.ToList (); foreach (User_details utilizator în entityToUpdate) user.user_name = user.user_name.ToLower ();  context.SubmitChanges (); 

Pasul 4: Ștergerea înregistrărilor

Creați un fișier de clasă, DatabaseDelete.cs ,pentru operațiile de ștergere. În DatabaseDelete clasă, adăugați a DeleteUser care acceptă un parametru id și șterge un singur utilizator ale cărui id se potrivește cu parametrul transmis.

public void DeleteUser (id șir) // șterge utilizatorul după id folosind (UserDataContext context = nou UserDataContext (UserDataContext.DBConnectionString)) IQueryable entityQuery = de la c în context.Users unde c.ID.Equals (id) selectați c; User_details entităToDelete = entitateQuery.FirstOrDefault (); context.Users.DeleteOnSubmit (entityToDelete); context.SubmitChanges (); 

Funcția de apeluri DeleteOnSubmit, care șterge o singură înregistrare din baza de date. Modificările sunt salvate când Trimite schimbări se numește funcția. DeleteUser funcția șterge o singură înregistrare din baza de date, după cum se arată mai jos.

Bază de dateDelete delete = new DatabaseDelete (); delete.DeleteUser ( "1");

System.Data.Linq ansamblul furnizează o funcție DeleteAllOnSubmit pentru a șterge mai multe înregistrări simultan. Următorul fragment de cod trunchiază User_details masa.

folosind (UserDataContext context = nou UserDataContext (UserDataContext.DBConnectionString)) IQueryable entityQuery = de la c în context.Users selectați c; IList entityToDelete = entitateQuery.ToList (); context.Users.DeleteAllOnSubmit (entityToDelete); context.SubmitChanges (); 

Această funcție acceptă o listă de înregistrări și șterge înregistrările din lista respectivă. Rețineți că în ambele cazuri modificările sunt salvate numai atunci când Trimite schimbări se numește funcția.

Concluzie

Aplicațiile Windows Phone utilizează LINQ pentru SQL pentru toate operațiile bazei de date. LINQ to SQL este folosit pentru a defini schema bazei de date, a selecta date și a salva modificările din fișierul bazei de date care stă la baza stocării izolate a aplicației. LINQ to SQL oferă o abordare orientată pe obiecte pentru lucrul cu datele stocate într-o bază de date și constă dintr-un model de obiect și un runtime. Vă recomandăm să citiți acest articol MSDN pentru cele mai bune practici privind utilizarea bazelor de date locale. Simțiți-vă liber să descărcați fișierele sursă ale tutorialului pentru a le utiliza ca referință.

Cod