Arbeiten mit lokalen Datenbanken unter Windows Phone 8

Im vorherigen Artikel haben Sie erfahren, wie Sie Daten im isolierten Speicher Ihrer App speichern. In diesem Artikel konzentrieren wir uns auf die Arbeit mit lokalen Datenbanken, die sich im isolierten Speicher Ihrer App befinden. Sie lernen Datenbankvorgänge mit LINQ, Datenbankschemas sowie das Abrufen von Daten aus einer lokalen Datenbank.

1. Einleitung

Sie können relationale Daten in einer lokalen Datenbank speicherndas lebt im isolierten Speicher Ihrer App. Alle Datenbankvorgänge unter Windows Phone werden mit LINQ to SQL ausgeführt. Es wird verwendet, um das Datenbankschema zu definieren, Daten auszuwählen und Änderungen an der zugrunde liegenden Datenbankdatei zu speichern, die sich im lokalen Ordner befindet. 

Das LINQ to SQL-Objektmodell verwendet die System.Data.Linq.DataContext Namespace, um einen Proxy-Aufruf an die lokale Datenbank durchzuführen. Die LINQ to SQL-Laufzeit fungiert als Brücke zwischen der Datenkontext Objekt und die echte Daten Manipulationen durchführen.

Bei der Arbeit mit lokalen Datenbanken unter Windows Phone ist Folgendes zu beachten:

  • Die lokale Datenbank wird im Prozess der Windows Phone-App ausgeführt. Es wird nicht kontinuierlich als Hintergrunddienst ausgeführt.
  • Sie können nur von der entsprechenden Windows Phone-App darauf zugreifen.
  • Es kann nur mit LINQ to SQL zugegriffen werden, Transact-SQL wird nicht unterstützt.
  • Um den Zugriff auf den lokalen Ordner über verschiedene Threads hinweg zu synchronisieren, Mutex Klasse wird verwendet.
  • Es wird nicht empfohlen, die Referenzdatenbankdatei zu verschlüsseln, wenn Sie ausschließlich über den Installationsordner darauf zugreifen. Auf diese Weise wird verhindert, dass das System bei der ersten Verbindung Routineoperationen für die Datenbankwartung ausführt, z. B. eine Neuindizierung.

Dieser Artikel beschreibt, wie Sie eine lokale Datenbank erstellen und Daten einfügen, aktualisieren oder löschen können. Wir erstellen eine Beispielanwendung mit einem Nutzerdetails Tabelle und führen Sie verschiedene Operationen darauf aus. Wir werden die Codedateien für verschiedene Vorgänge wie Einfügen, Aktualisieren und Löschen der Einfachheit halber trennen. 

2. Erstellen des Datenkontexts

Die Tabellen für die Datenbank können an beliebiger Stelle in der App definiert werden, sofern sie global verfügbar sind. Wir erstellen eine separate Datei, DB.cs, für alle tische. In dieser Datei geben wir ein Objektmodell an, das das bestimmt Datenbankschema und das erstellen Datenkontext.

Schritt 1: Referenzen hinzufügen

Fügen Sie die folgenden Anweisungen oben in der Zeile hinzu DB.cs Datei zum Verweisen auf LINQ to SQL-Assembly:

using System.Data.Linq; using System.Data.Linq.Mapping;

Schritt 2: Erstellen einer Tabelle

Fügen Sie eine Entitätsklasse mit dem Namen hinzu Nutzerdetails Dies stellt die Datenbanktabelle der App in der lokalen Datenbank dar. Das Attribut [Tabelle] Gibt die LINQ to SQL-Laufzeit an, um die Klasse einer lokalen Datenbanktabelle zuzuordnen.

[Table] public class User_details [Spalte (IsDbGenerated = true, IsPrimaryKey = true)] public int ID get; einstellen;  [Column] öffentliche Zeichenfolge Benutzername get; einstellen;  [Column] öffentliche Zeichenfolge user_email get; einstellen; 

Wie Sie sehen können, die Nutzerdetails Klasse hat drei öffentliche Eigenschaften, die drei Datenbankspalten entsprechen:

  • ICH WÜRDE ist eine Bezeichnerspalte, die automatisch von der Datenbank aufgefüllt wird. Dies ist auch der Primärschlüssel, für den automatisch ein Datenbankindex erstellt wird. Diese und weitere Einstellungen werden mit dem Spaltenzuordnungsattribut LINQ to SQL angegeben, das über der Eigenschaftssyntax steht.
  • Nutzername ist eine Spalte, in der der Name des Benutzers gespeichert wird.
  • Benutzer Email ist eine Spalte zum Speichern der E-Mail-Adresse des Benutzers.

Schritt 1: Datenkontext definieren

Die Klasse UserDataContext erbt von DataContext und wird als das bezeichnet Datenkontext. Dieser Code ruft den Basiskonstruktor auf und deklariert die benannte Datenbanktabelle Nutzerdetails. Die lokale Datenbank wird im isolierten Speicher der App gespeichert und in unserem Beispiel als gespeichert Datenbanken.sdf

öffentliche Klasse UserDataContext: DataContext öffentliche statische Zeichenfolge DBConnectionString = @ "isostore: /Databases.sdf"; public UserDataContext (Zeichenfolge connectionString): base (connectionString)  public Table Benutzer get return this.GetTable(); 

Beachten Sie, dass die Datenbankverbindungszeichenfolge kein statisches Feld sein muss. Wir gebrauchen DBConnectionString in diesem Fall nur der Bequemlichkeit halber.

3. Anlegen der Datenbank

Um die Datenbank zu erstellen, öffnen Sie den Code hinter der Datei der App mit dem Namen App.xaml.cs. Fügen Sie den folgenden Code mit dem Namen am Ende seines Konstruktors hinzu App.

using (UserDataContext context = new UserDataContext (UserDataContext.DBConnectionString)) if (! context.DatabaseExists ()) context.CreateDatabase (); 

Der Datenbankerstellungscode wird hier hinzugefügt, damit die Datenbank vorhanden ist, bevor der Code von der Hauptseite ausgeführt wird. Der Code prüft, ob die Datenbank existiert, und wenn keine Datenbank gefunden wird, wird eine neue erstellt.

4. Datenbankoperationen

Sobald der Datenkontext erstellt und die Datenbank erstellt wurde, können wir Vorgänge darauf ausführen. Sie können Datensätze aus der soeben erstellten Tabelle einfügen, aktualisieren und löschen. Wir haben separate Klassen für die Funktionen zum Einfügen, Löschen und Aktualisieren erstellt.

Schritt 1: Einfügen von Datensätzen

Es ist praktisch, eine separate Klassendatei zu erstellen, DatabaseAdd.cs, zum Hinzufügen von Datensätzen zur Datenbank. Funktion definieren Nutzer hinzufügen das macht Name und email_id als Parameter und fügt einen Datensatz hinzu Nutzerdetails Tabelle.

public void AddUser (String-Name, String-E-Mail) using (UserDataContext context = new UserDataContext (UserDataContext.DBConnectionString)) User_details du = new User_details (); du.user_name = name; du.user_email = email; context.Users.InsertOnSubmit (du); context.SubmitChanges (); 

Das Nutzer hinzufügen Funktion verwendet dieUserDataContext Datenkontext für die Verbindung zur Datenbank erstellt eine neue Instanz von Nutzerdetails Entitätsklasse und fügt einen Datensatz ein.

Neue Elemente, die dem Datenkontext hinzugefügt wurden, werden erst in der Datenbank gespeichert SubmitChanges Funktion wird aufgerufen. Ruf den Nutzer hinzufügen Funktion, um einen Datensatz zur Datenbank hinzuzufügen.

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

Schritt 2: Datensätze abrufen

Erstellen Sie eine separate Klassendatei, FetchDatabase.cs, zum Abrufen von Datensätzen aus der Datenbank. Diese Klasse enthält eine GetAllUsers Funktion, die ein zurückgibt IList Instanz, die die aus der Tabelle abgerufenen Datensätze enthält.

Die Verbindung wird mit dem Datenkontext eingerichtet, nach dem Datensätze aus dem Server abgerufen werden Nutzerdetails Tabelle. Die LINQ-Abfrage gibt ein IList Instanz, die die abgerufenen Datensätze enthält. Das IList Instanz ist nichts weiter als eine Sammlung von Objekten desselben Typs.

öffentliche IList GetAllUsers () IList list = null; using (UserDataContext context = new UserDataContext (UserDataContext.DBConnectionString)) IQueryable Abfrage = aus c im Kontext. Benutzer wählen c aus; list = query.ToList ();  Rückkehrliste; 

In dem folgenden Codeausschnitt definieren wir a Benutzer Klasse mit Datenmitgliedern Ich würde, Name, und Email die Details aus den abgerufenen Datensätzen enthalten.

Klasse Benutzer öffentliche String-ID get; einstellen;  öffentlicher String-Name get; einstellen;  öffentliche String-E-Mail get; einstellen; 

Erstellen Sie eine weitere Funktion, getAllUsers, das gibt eine Liste von zurück Benutzer wenn gerufen Die Funktion erstellt eine neue Liste mit den Details der abgerufenen Benutzer. Es iteriert durch die IList Instanz benannt usrs und fügt die Details jedes Benutzers zum hinzu Alle Nutzer Beispiel.

öffentliche Liste getUsers () IList usrs = this.GetAllUsers (); Liste allUsers = neue Liste(); foreach (User_details m in usrs) Benutzer n = neue Benutzer (); n.id = m.ID.ToString (); n.name = m.benutzername; n.email = m.user_email; allUsers.Add (n);  allUsers zurückgeben; 

In der Beispielanwendung dieses Artikels wird der getUsers Funktion wird verwendet, um das einzustellen ItemSource des Listbox genannt Alle Nutzer Wie nachfolgend dargestellt.

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

Schritt 3: Datensätze aktualisieren

Das Aktualisieren von Datensätzen ähnelt dem Hinzufügen von Datensätzen zu einer Tabelle. Um unseren modularen Ansatz fortzusetzen, erstellen wir eine neue Klassendatei, DatabaseUpdate.cs, für Datenbankaktualisierungen. Im Gegensatz zu Löschvorgängen gibt es keine Funktion, um mehrere Datensätze gleichzeitig zu aktualisieren.

Funktion hinzufügen UpdateUsers das akzeptiert ein Ich würde, Name, und email_id, und aktualisiert die Tabellenzeile für die entsprechende Ich würde.

public void UpdateUser (int id, String-E-Mail, Stringname) using (UserDataContext-Kontext = neuer UserDataContext (UserDataContext.DBConnectionString)) IQueryable entityQuery = from c in context.Users mit c.ID == id select c; Benutzerdaten entityToUpdate = entityQuery.FirstOrDefault (); entityToUpdate.user_name = name; entityToUpdate.user_email = E-Mail; context.SubmitChanges (); 

Die Funktion fragt die Datenbank ab und speichert den ersten übereinstimmenden Datensatz in der Datenbank entityToUpdate Variable. Anschließend wird der Datensatz aktualisiert, indem die neuen Werte zugewiesen werden, und die Änderungen werden zur Aktualisierung der Datenbank übermittelt.

Die Datenbank wird erst aktualisiert, wenn wir das aufrufen SubmitChanges Funktion. Diese Funktion aktualisiert nur den ersten übereinstimmenden Datensatz. Das UpdateUser Die Funktion wird aufgerufen, um vorhandene Datensätze in der Datenbank zu aktualisieren (siehe unten).

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

Um mehrere Datensätze zu aktualisieren, müssen Sie die Datensätze, die Sie aktualisieren möchten, nacheinander durchlaufen. Im folgenden Code-Snippet aktualisieren wir den Namen jeder Verwendung in der Datenbank, indem sie in Kleinbuchstaben geschrieben wird.

using (UserDataContext context = new UserDataContext (UserDataContext.DBConnectionString)) IQueryable entityQuery = from c in context.Users select c; IList entityToUpdate = entityQuery.ToList (); foreach (user_details Benutzer in entityToUpdate) user.user_name = user.user_name.ToLower ();  context.SubmitChanges (); 

Schritt 4: Löschen von Datensätzen

Erstellen Sie eine Klassendatei, DatabaseDelete.cs ,für Löschvorgänge. In dem DatabaseDelete Klasse, fügen Sie ein Benutzer löschen Funktion, die einen Parameter akzeptiert Ich würde und löscht einen einzelnen Benutzer, dessen Ich würde stimmt mit dem übergebenen Parameter überein.

public void DeleteUser (String-ID) // Benutzer nach ID löschen using (UserDataContext context = new UserDataContext (UserDataContext.DBConnectionString)) IQueryable entityQuery = from c im Kontext. Benutzer, bei denen c.ID.Equals (id) c auswählt; User_details entityToDelete = entityQuery.FirstOrDefault (); context.Users.DeleteOnSubmit (entityToDelete); context.SubmitChanges (); 

Die Funktion ruft auf DeleteOnSubmit, Dadurch wird ein einzelner Datensatz aus der Datenbank gelöscht. Die Änderungen werden gespeichert, wenn die SubmitChanges Funktion wird aufgerufen. Das Benutzer löschen Die Funktion löscht einen einzelnen Datensatz aus der Datenbank (siehe unten).

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

Das System.Data.Linq Baugruppe bietet eine Funktion DeleteAllOnSubmit mehrere Datensätze gleichzeitig löschen. Das folgende Code-Snippet schneidet die Nutzerdetails Tabelle.

using (UserDataContext context = new UserDataContext (UserDataContext.DBConnectionString)) IQueryable entityQuery = from c in context.Users select c; IList entityToDelete = entityQuery.ToList (); context.Users.DeleteAllOnSubmit (entityToDelete); context.SubmitChanges (); 

Diese Funktion akzeptiert eine Liste von Datensätzen und löscht die Datensätze in dieser Liste. Beachten Sie, dass in beiden Fällen die Änderungen nur gespeichert werden, wenn die SubmitChanges Funktion wird aufgerufen.

Fazit

Windows Phone-Apps verwenden LINQ to SQL für alle Datenbankvorgänge. LINQ to SQL wird verwendet, um das Datenbankschema zu definieren, Daten auszuwählen und Änderungen an der zugrunde liegenden Datenbankdatei zu speichern, die sich im isolierten Speicher der App befindet. LINQ to SQL bietet einen objektorientierten Ansatz für das Arbeiten mit in einer Datenbank gespeicherten Daten und besteht aus einem Objektmodell und einer Laufzeitumgebung. Ich empfehle Ihnen, diesen MSDN-Artikel mit Best Practices für die Verwendung lokaler Datenbanken zu lesen. Fühlen Sie sich frei, die Quelldateien des Tutorials als Referenz herunterzuladen.