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.
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:
mutex
klassen används.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.
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.
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;
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.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 bordAnvä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.
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.
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.
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]");
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 IListGetAllUsers () 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 listagetUsers () 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 ();
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)) IQueryableentityQuery = 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)) IQueryableentityQuery = 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 ();
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)) IQueryableentityQuery = 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)) IQueryableentityQuery = 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.
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.