Arbeta med lokala databaser på Windows Phone 8

I den föregående artikeln lärde du dig hur du lagrar data i din apps isolerade lagring. I den här artikeln fokuserar vi på att arbeta med lokala databaser som lever i din apps isolerade lagring. Du lär dig om databasoperationer med LINQ, databasscheman samt hur du hämtar data från en lokal databas.

1. Introduktion

Du kan lagra relationella data i en lokal databassom lever i din apps isolerade lagring. All databasoperationer på Windows Phone utförs med LINQ till SQL. Det används för att definiera databasschemat, välj data och spara ändringar i den underliggande databasfilen som finns i den lokala mappen. 

LINQ till SQL-objektmodellen använder System.Data.Linq.DataContext namnrymd för att göra ett proxysamtal till den lokala databasen. LINQ till SQL runtime fungerar som en bro mellan datakontext objekt och verkliga data att göra manipuleringar.

När du arbetar med lokala databaser på Windows Phone är det viktigt att hålla följande i åtanke:

  • Den lokala databasen körs i Windows Phone-appens process. Det går inte fortlöpande som en bakgrundstjänst.
  • Den kan endast nås av motsvarande Windows Phone-app.
  • Den kan endast nås med LINQ till SQL, Transact-SQL stöds inte.
  • För att synkronisera åtkomst till den lokala mappen över olika trådar, mutex klassen används.
  • Det rekommenderas inte att kryptera referensdatabasfilen om du bara kommer åt den från installationsmappen. Om du gör det förhindrar systemet att utföra rutinmässiga databasunderhållsoperationer, t.ex. omindexering, vid den första anslutningen.

Den här artikeln visar hur du kan skapa en lokal databas och infoga, uppdatera eller radera data från den. Vi ska bygga en provapplikation med a Användaruppgifter bord och utför olika operationer på den. Vi kommer att segregera kodfilerna för olika operationer, t.ex. infoga, uppdatera och ta bort för enkelhets skull. 

2. Bygga datakontexten

Tabellerna för databasen kan definieras var som helst i appen så länge den är tillgänglig globalt. Vi skapar en separat fil, DB.cs, för alla borden. I den här filen anger vi en objektmodell som bestämmer databasschema och skapa datakontext.

Steg 1: Lägga till referenser

Lägg till följande direktiv längst upp på sidan DB.cs fil för att referera till LINQ till SQL-montering:

använder System.Data.Linq; använder System.Data.Linq.Mapping;

Steg 2: Skapa ett bord

Lägg till en enhetsklass som heter User_details som representerar databastabellen för appen i den lokala databasen. Attributet [Tabell] Indikerar LINQ till SQL runtime för att kartlägga klassen till en lokal databas tabell.

[Table] public class User_details [Kolumn (IsDbGenerated = true, IsPrimaryKey = true)] public int ID get; uppsättning;  [Kolumn] allmän sträng användarnamn get; uppsättning;  [Kolumn] allmän sträng user_email get; uppsättning; 

Som du kan se, är User_details klassen har tre offentliga egenskaper som motsvarar tre databaskkolumner:

  • ID är en identifierarkolonn som automatiskt fylls av databasen. Det är också den primära nyckeln för vilken ett databasindex skapas automatiskt. Dessa inställningar och mer specificeras med attributet LINQ till SQL-kolumnkartning skrivet ovanför egenskapssyntaxen.
  • Användarnamn är en kolumn för att lagra användarens namn.
  • user_email är en kolumn för att lagra användarens e-postadress.

Steg 1: Definiera datakontext

Klassen UserDataContext ärver från DataContext och kallas den datakontext. Denna kod kallar baskonstruktorn och deklarerar databastabellen som heter User_details. Den lokala databasen lagras i appens isolerade lagring och i vårt exempel sparas den som Databases.sdf

public class UserDataContext: DataContext offentlig statisk sträng DBConnectionString = @ "isostore: /Databases.sdf"; allmän UserDataContext (string connectionString): bas (connectionString)  offentligt bord Användare get return this.GetTable(); 

Observera att databasanslutningssträngen inte krävs för att vara ett statiskt fält. Vi använder DBConnectionString i detta fall bara för bekvämlighet.

3. Skapa databasen

För att skapa databasen, öppna koden bakom filen i appen, namngiven App.xaml.cs. Lägg till följande kod i slutet av dess konstruktör, namngiven App.

använder (UserDataContext context = nytt UserDataContext (UserDataContext.DBConnectionString)) om (! context.databaseExists ()) context.CreateDatabase (); 

Databasskapskoden läggs till här så att databasen kommer att finnas närvarande innan koden från huvudsidan körs. Koden kontrollerar om databasen finns och om ingen databas hittas skapas en ny.

4. Databasoperationer

När datakontexten har byggts och databasen har skapats kan vi utföra operationer på den. Du kan infoga, uppdatera och ta bort poster från tabellen som vi just skapat. Vi har skapat separata klasser för att hålla funktioner för att infoga, ta bort och uppdatera operationer.

Steg 1: Sätta in poster

Det är bekvämt att skapa en separat klassfil, DatabaseAdd.cs, för att lägga till några poster i databasen. Definiera en funktion Lägg till användare det tar namn och e-post ID som parametrar och lägger till en post i User_details tabell.

public void AddUser (String namn, String email) using (UserDataContext context = nytt UserDataContext (UserDataContext.DBConnectionString)) User_details du = new User_details (); du.user_name = namn; du.user_email = email; context.Users.InsertOnSubmit (du); context.SubmitChanges (); 

De Lägg till användare funktionen använderUserDataContext datakontext för att ansluta till databasen, skapar en ny instans av User_details enhetsklass och lägger in en post.

Nya objekt som har lagts till i datakontext sparas inte i databasen tills SubmitChanges funktion kallas. Ring Lägg till användare funktion för att lägga till en post i databasen.

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

Steg 2: Hämta poster

Skapa en separat klassfil, FetchDatabase.cs, för att hämta poster från databasen. Denna klass innehåller a GetAllUsers funktion som returnerar en IList exempel, innehållande de poster som hämtats från bordet.

Anslutningen är konfigurerad med datakontext efter vilka poster som hämtas från User_details tabell. LINQ-frågan returnerar en IList Exempel som innehåller de hämtade posterna. De IList Exempel är inget annat än en samling objekt av samma typ.

offentlig IList GetAllUsers () IList list = null; använder (UserDataContext context = nytt UserDataContext (UserDataContext.DBConnectionString)) IQueryable fråga = från c i context.Users väljer c; list = query.ToList ();  returlista; 

I det nedre kodfältet definierar vi en användare klass med data medlemmar id, namn, och e-post för att hålla detaljerna från de hämtade dokumenten.

klass användare public string id get; uppsättning;  offentligt strängnamn get; uppsättning;  public string email get; uppsättning; 

Skapa en annan funktion, getAllUsers, som returnerar en lista över användare när det kallas. Funktionen skapar en ny lista för att hålla detaljerna för de hämtade användarna. Det itererar genom IList exemplet heter usrs och lägger till detaljerna för varje användare till alla användare exempel.

offentlig lista getUsers () IList usrs = this.GetAllUsers (); Lista allUsers = ny lista(); 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);  returnera alla användare 

I provanvändningen av denna artikel, den getUsers funktionen används för att ställa in ItemSource av listbox som heter alla användare enligt nedanstående.

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

Steg 3: Uppdatering av poster

Uppdatering av poster liknar mycket att lägga till poster i en tabell. Fortsatt med vårt modulära tillvägagångssätt skapar vi en ny klassfil, DatabaseUpdate.cs, för databasuppdateringar. Till skillnad från borttagningsoperationer finns det ingen funktion att uppdatera flera poster samtidigt.

Lägg till en funktion UpdateUsers som accepterar en id, namn, och e-post ID, och uppdaterar tabellraden för motsvarande id.

public void UpdateUser (int id, String email, String namn) using (UserDataContext context = nytt UserDataContext (UserDataContext.DBConnectionString)) IQueryable entityQuery = från c i context.Users där c.ID == id välj c; User_details entityToUpdate = entityQuery.FirstOrDefault (); entityToUpdate.user_name = namn; entityToUpdate.user_email = email; context.SubmitChanges (); 

Funktionen frågar databasen och lagrar den första matchade posten i entityToUpdate variabel. Den uppdaterar sedan posten genom att tilldela de nya värdena och skickar ändringarna för att uppdatera databasen.

Databasen uppdateras inte förrän vi kallar SubmitChanges fungera. Den här funktionen uppdaterar endast den första matchade posten. De UpdateUser funktion kallas för att uppdatera befintliga poster i databasen som visas nedan.

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

För att uppdatera flera poster måste du iterera genom de poster som du vill uppdatera en efter en. I följande kodstämpel uppdaterar vi namnet på varje användning i databasen genom att göra den små bokstäver.

använder (UserDataContext context = nytt UserDataContext (UserDataContext.DBConnectionString)) IQueryable entityQuery = från c i context.Users väljer c; IList entityToUpdate = entityQuery.ToList (); foreach (User_details användare i entityToUpdate) user.user_name = user.user_name.ToLower ();  context.SubmitChanges (); 

Steg 4: Radera poster

Skapa en klassfil, DatabaseDelete.cs ,för att radera operationer. I DatabaseDelete klass, lägg till en DeleteUser funktion som accepterar en parameter id och raderar en enda användare vars id matchar inmatningsparametern.

public void DeleteUser (String id) // radera användaren av id using (UserDataContext context = nytt UserDataContext (UserDataContext.DBConnectionString)) IQueryable entityQuery = från c i context.Users där c.ID.Equals (id) välj c; User_details entityToDelete = entityQuery.FirstOrDefault (); context.Users.DeleteOnSubmit (entityToDelete); context.SubmitChanges (); 

Funktionen ringer DeleteOnSubmit, som tar bort en enskild post från databasen. Ändringarna sparas när SubmitChanges funktion kallas. De DeleteUser funktionen raderar en enskild post från databasen som visas nedan.

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

De System.Data.Linq montering ger en funktion DeleteAllOnSubmit att radera flera poster samtidigt. Följande kodstämpel avkortar User_details tabell.

använder (UserDataContext context = nytt UserDataContext (UserDataContext.DBConnectionString)) IQueryable entityQuery = från c i context.Users väljer c; IList entityToDelete = entityQuery.ToList (); context.Users.DeleteAllOnSubmit (entityToDelete); context.SubmitChanges (); 

Den här funktionen accepterar en lista över poster och raderar poster i den listan. Notera att i båda fallen sparas ändringarna endast när SubmitChanges funktion kallas.

Slutsats

Windows Phone apps använder LINQ till SQL för alla databasoperationer. LINQ till SQL används för att definiera databasschemat, välj data och spara ändringar i den underliggande databasfilen som finns i appens isolerade lagring. LINQ till SQL ger ett objektorienterat förhållningssätt för att arbeta med data lagrad i en databas och består av en objektmodell och en runtime. Jag rekommenderar att du läser denna MSDN-artikel för bästa praxis när du använder lokala databaser. Ta gärna hämta källkursfilerna för handledningen för att använda som referens.