An Introduksjon til Xamarin.Forms og SQLite
59
Del
Del
Del
Dette Cyber Monday Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.
På et tidspunkt i mobile utviklingen din karriere, er du nødt til å forholde seg til data. Håndteringen av data betyr mer enn behandling og visning av informasjon til sluttbruker. Du kommer til å trenge å lagre denne informasjonen et sted og være i stand til å få på det enkelt. Takket være Xamarin og åpen kildekode programvare, kan du enkelt lagre dine data med en bransje testet plattform, SQLite.
1. Lagre data
Så hvorfor trenger du å bry seg om data når det kommer til din app? Fordi det er alt rundt deg. Du kan ikke unnslippe den. Uansett hva slags app du skriver, enten det er et spill eller en slags verktøy, skal du trenger å lagre data på et tidspunkt. At data kan være brukerdata, statistikk, eller noe annet av interesse at enten du eller brukeren vil være interessert i på et tidspunkt i bruk av programmet ditt.
På dette punktet, la oss anta at du har bestemt å gå den Xamarin.Forms rute, fordi du er interessert i å målrette flere plattformer, ikke bare i logikken for din app, men også for brukergrensesnittet laget.
Great. Men hva gjør du nå at du trenger å lagre informasjon i app? Ikke bekymre deg, det er en veldig enkel løsning på dette problemet, SQLite.
2. Introduksjon til SQLite
Du har nå sett begrepet SQLite et par ganger i denne opplæringen, er det på tide å komme ned til kjøtt. Hva er egentlig SQLite? SQLite er et offentlig domene, null konfigurasjon, transaksjons SQL-databasemotor. Alt dette betyr er at du har et fullverdig mekanisme for å lagre data på en strukturert måte. Ikke bare får du alt dette, har du også tilgang til kildekoden, fordi det er åpen kildekode.
Vi vil ikke dekke alle funksjonene til SQLite i denne opplæringen rett og slett fordi det er for mange til å gå gjennom. Vær trygg på at du vil ha muligheten til å enkelt lage en tabell struktur for å lagre data og hente den i din app. Dette er begreper som vi vil fokusere på i denne opplæringen.
I en verden av Xamarin.Forms, er SQLite en naturlig tilpasning for en veldig enkel grunn. SQLite motoren er lett tilgjengelig på både iOS og Android. Dette betyr at du kan bruke denne teknologien rett ut av boksen når du velger å skrive et Xamarin.Forms app.
Å få tilgang til SQLite funksjonalitet i Windows Phone-apps krever ett ekstra skritt som vi vil gå over en liten seinere. All denne funksjonaliteten og cross platform tilgjengelighet er flott, men hvordan skal vi få tilgang til de innfødte plattform implementeringer fra vårt C # -kode i Xamarin.Forms? Fra et fint nuget pakke, det er hvordan. La oss ta en titt.
3. Opprette en app
La oss begynne med å lage en enkel Xamarin.Forms søknad. I denne opplæringen, vil jeg være å bruke en Mac som kjører Xamarin Studio, men du kan like gjerne være å bruke Xamarin Studio eller Visual Studio kjører på en PC Vi starter prosessen ved å opprette en ny Xamarin.Forms app. For å gjøre dette, velger du bare Mobile Apps prosjektmalen familien til venstre og velg en av de Xamarin.Forms maler på høyre side. Du kan bruke enten PCL eller Delt versjon av malen, men for denne saken, vil jeg være med PCL. Du kan følge med ved hjelp av enten en, men det vil være en liten forskjell hvis du velger Delt mal senere. Du kan gi prosjektet et navn du liker. Jeg vil kalle dette prosjektet IntroToSQLite. Når du klikker på OK-knappen, vil din IDE gå gjennom prosessen med å opprette din løsning. Din løsning vil inneholde fire prosjekter: Nå som vi har vår grunnleggende prosjekt struktur satt opp, kan vi begynne å legge tilgang til SQLite til vår PCL prosjekt. Vi trenger å installere en ny pakke inn i vårt prosjekt kalt SQLite.Net. Dette er en .NET wrapper rundt SQLite som vil tillate oss å få tilgang til de innfødte SQLite funksjonalitet fra en Xamarin.Forms PCL eller Delt prosjekt. Vi tilgang til denne nuget pakken ved å høyreklikke på enten pakker eller referanser, avhengig som IDE du bruker, og velg Legg Package (eller Reference). I søkeboksen skriver sqlite.net. Dette vil vise deg en ganske stor samling av pakker som du kan inkludere i prosjektet. Siden jeg valgte å gå PCL rute for min Xamarin.Forms prosjektet, vil jeg må velge SQLite.Net PCL pakken å inkludere i prosjektet mitt. Hvilken du velger hvis du gikk Delte prosjektet ruten do? Ingen. Hvis du har valgt Felles prosjektmalen tidligere i opplæringen, lurer du kanskje på hvordan du får tilgang til SQLite pakken. Det korte svaret er at du ikke kan. Hvis du husker fra en tidligere opplæringen, kan du ikke legge referanser til et felles prosjekt. For å få tilgang til SQLite fra en felles prosjekt, du bare legge kildekoden til prosjektet. Det siste trinnet i å legge SQLite funksjonalitet til PCL prosjektet er å skape en grensesnitt som vil gi oss tilgang til SQLite verden. Grunnen til at vi gjør dette er fordi vi trenger å få tilgang til lokale funksjonaliteten på de ulike plattformene som vi så i forrige tutorial. La oss starte med å definere et grensesnitt som kommer til å gi oss tilgang til SQLite database forbindelse. Innenfor PCL prosjekt, opprette et nytt grensesnitt som heter ISQLite og erstatte gjennomføringen med følgende: Dette er grensesnittet som vi skal gjennomføre og få tilgang til via DependencyService fra de innfødte implementeringer Vi har nå tilgang til SQLite funksjonalitet, la oss definere vår database. Denne spesielle søknad kommer til å være ganske enkel, og vi er bare nødt til å lagre noen av våre tilfeldige tanker som vi kommer opp med dem. Vi starter med å lage en klasse som vil representere de data som er lagret i en bestemt tabell . La oss kalle denne klassen RandomThought Som du kan se, er dette en veldig enkel klasse med tre egenskaper. To av disse egenskapene er bare din normale dagligdagse egenskaper, Thought og CreatedOn. Disse to egenskapene kommer til å representere kolonner i SQLite database, som vil inneholde en tabell med navnet RandomThought. Den tredje eiendom, ID, også kommer til å representere en kolonne i tabellen, og inneholder en unik id som vi kan bruke til å referere til en bestemt RandomThought rad i tabellen. Det interessante ting om ID eiendommen er at det er innredet med to attributter, PrimaryKey og AutoIncrement. PrimaryKey forteller SQLite at denne kolonnen kommer til å være primærnøkkelen i tabellen, noe som betyr at, som standard, det må være unikt, og det er en indeks brukes til det å fremskynde hentes fra denne tabellen når det refereres til en rad av denne kolonnen. AutoIncrement betyr at når vi setter inn en ny RandomThought i denne tabellen, vil ID-kolonnen fylles automatisk med neste tilgjengelige heltall. Det neste trinnet er å skape denne tabellen i databasen. Jeg liker å lage en klasse som representerer min database og holde all logikk for å få tilgang til databasen og dens tabeller i denne klassen. For dette, vil jeg lage en klasse som heter RandomThoughtDatabase: Dette er en veldig enkel implementering som det bare inneholder noen metoder. Disse er vanligvis noen av de grunnleggende operasjonene du utfører når du arbeider med en database. Ett punkt i notatet er konstruktøren. Innenfor konstruktøren gjør vi to ting. Først vi bruker DependencyService klassen for å få et registrert klasse som implementerer ISQLite grensesnitt og kaller sin getConnection metoden. I tillegg benytter vi CreateTable metoden på SQLiteConnection klasse for å lage en tabell kalt RandomThought. Denne metoden vil skape bordet, hvis det ikke finnes allerede, og exit grasiøst hvis det allerede eksisterer. Selvsagt kan du få så sofistikert med denne klassen som du ønsker ved å legge alle slags funksjonalitet, men disse operasjonene er vanligvis et godt utgangspunkt De fleste av koden som vi bruker til å kommunisere med databasen kommer til å bli funnet i PCL (eller delt) prosjekt. Men vi trenger fortsatt å gjøre en liten ledningsnett opp i de innfødte implementeringer for å få alt fungerer som det skal. Det viktigste hinderet for at vi må jobbe rundt på morssiden når du bruker SQLite er der vi kommer til å lagre Selve databasefilen. Dette skiller seg fra plattform til plattform. Her er hva vi trenger for iOS Før vi kan faktisk legge noen form for SQLite funksjonalitet til iOS-prosjektet, må vi legge til SQLite.Net PCL samt SQLite.NET PCL -. XamarinIOS Plattform pakker til dette prosjektet. Du kan følge den samme fremgangsmåten som du tok i trinn 2, og husk å legge både til prosjektet. Når du har lagt til denne pakken, kan du begynne å skrive noen SQLite koden i iOS-prosjektet. La oss lage en implementering av ISQLite grensesnitt for iOS. Start med å lage en ny klasse, og kalte den SQLite_iOS Vi får tilgang til riktig sted å lagre databasefilen, opprette et nytt SQLiteConnection objekt, og gi det tilbake til vår PCL (eller delt) prosjekt. Forsamlingen attributt på toppen av filen brukes til å identifisere denne klassen som en avhengighet som kan hentes via Get metoden på DependencyService klassen Dette trinnet er svært lik den forrige. Den eneste forskjellen er at koden vil forandre litt på grunn av det faktum at plasseringen av databasefilen vil være forskjellig. Du vil fortsatt trenger å legge de riktige pakker til Android-prosjektet (SQLite.Net PCL og SQLite.NET PCL - XamarinAndroid) som du gjorde før. Når du har fullført det, kan du legge den riktige koden i en ny klasse som heter SQLite_Android Du har nå en fungerende implementering av ISQLite grensesnittet fra perspektivet til din Android app Siden jeg kjører dette programmet fra en Mac, vil jeg ikke lage Windows Phone implementering, men hvis du ønsker å gjøre dette, du kan. Det første trinnet er å legge til støtte for Windows Phone prosjekt for SQLite. Som nevnt tidligere, kommer SQLite som standard på iOS og Android. Dette er ikke sant for Windows Phone, men det er støttet. For å få det installert, kan du følge instruksjonene som finnes på Xamarin nettstedet. Etter å ha installert SQLite, vil prosessen med å legge til funksjonalitet for Windows Phone være nesten nøyaktig det samme, bortsett fra at pakkene å installere er SQLite .net PCL og SQLite.Net PCL - WindowsPhone 8 Platform. Med disse pakkene er installert, kan du lage Windows Phone gjennomføringen av ISQLite grensesnittet Det du . har det nå du har alle dine innfødte implementeringer komplett Det er på tide å gi denne app et brukergrensesnitt og få dataene inn i databasen Siden denne opplæringen er godt inn i temaet Xamarin.Forms, kommer jeg til å anta at du minst ha en grunnleggende kjennskap til Xamarin.Forms. Med denne forutsetningen i tankene, jeg kommer ikke til å gå inn i en masse detaljer om prosessen med å lage brukergrensesnittet. Hvis du trenger mer bakgrunnsinformasjon om Xamarin.Forms, sjekk ut mine andre Xamarin.Forms tutorials på Tuts +. Brukergrensesnittet skal bestå av to separate sider. Den første siden vil inneholde en liste over alle de tanker vi har gått inn i en liste, mens den andre siden vil la brukeren skrive inn en ny tanke. La oss bygge disse sidene. Vi vil først fokusere på å lage den første siden som skal inneholde en liste over RandomThought stedene. Start med å lage en ny fil i PCL (eller delt) prosjektet og name it RandomThoughtsPage. Erstatte standard gjennomføring med følgende: Det meste av arbeidet som er gjort i denne klassen er i konstruktøren. Konstruktøren tillater oss å passere i en forekomst av RandomThoughtsDatabase å få alle lagrede tanker. Vi setter egenskapen Title på siden for å "Random Thoughts", hente alle de eksisterende tanker, skape en ny forekomst av en Listview, og skape en ToolbarItem som vil tillate oss å klikke på en knapp for å få opp inngangssiden. Vi har ikke gjennomført det ennå, men vi vil om kort tid. For å få vår nye RandomThoughtsPage opp på skjermen, må vi gjøre en liten endring i App.cs filen. Innenfor denne filen, endre GetMainPage metoden for å se ut som følgende: GetMainPage metoden skaper nå en ny forekomst av vår RandomThoughtDatabase klasse og returnerer en ny forekomst av RandomThoughtsPage. Med denne endringen, bør våre iOS og Android apps se omtrent slik ut: Vi har nå en liste side for alle våre RandomThought objekter, men vi har ikke en måte å gå inn nye. For det, vil vi opprette en annen side som ligner på forrige side. Opprett en ny fil i PCL (eller delt) prosjektet og kaller det ThoughtEntryPage. Erstatte standard gjennomføring med følgende: I denne klassen, er alt arbeidet gjort i konstruktøren. Vi får en referanse til den overordnede siden, RandomThoughtsPage, samt databasen. Resten er grunnleggende oppsett kode med en post gjenstand for inntasting av tekst og en knapp. Når brukeren kraner Button, bruker vi databasen for å legge den nye tanken, avviser side, gå tilbake til listen siden , og kaller Refresh metode for å oppdatere Listview. Når dette er all kablet opp, kan vi kjøre det å faktisk legge inn noen verdier Her er hvordan det ser ut på iOS og Android for å angi noen av dine tanker. Etter at du har tastet inn noen tanker, vil listen se omtrent slik ut: Det du har det. Du har nå muligheten til å legge databasen funksjonalitet til Xamarin.Forms app til å lagre og hente alle slags data med letthet. For å fortsette din læring reise med Xamarin.Forms og SQLite, gir jeg deg følgende utfordring . Se om du kan forbedre dette programmet for å aktivere sletting av tanker og oppdatere listen siden på en lignende måte som posten siden. Lykke og lykkelige koding.
Trinn 1 Bilde:. Opprett et prosjekt
IntroToSQLite - PCL prosjektet
IntroToSQLite.Android - Android-prosjektet
IntroToSQLite.iOS - iOS prosjektet
IntroToSQLite.WinPhone - Windows Phone-prosjektet (kun på PC)
Trinn 2: Legg SQLite Support
SQLite og Delt Prosjekter
Legg noen kode
bruker System; hjelp SQLite.Net; navne IntroToSQLite {public interface ISQLite {SQLiteConnection getConnection (); }}
Trinn 3:. Definer Database
bruker System;. Bruker SQLite.Net.Attributes; navne IntroToSQLite {public class RandomThought {[PrimaryKey, AutoIncrement] public int ID {får; sett; } Public string Thought {får; sett; } Public Datetime CreatedOn {får; sett; } Public RandomThought () {}}}
bruker System; hjelp SQLite.Net, bruker Xamarin.Forms, bruker System.Collections.Generic, bruker System.Linq; navne IntroToSQLite {public class RandomThoughtDatabase {private SQLiteConnection _connection; offentlig RandomThoughtDatabase () {_connection = DependencyService.Get < ISQLite > () .GetConnection (); _connection.CreateTable < RandomThought > (); } Public IEnumerable < RandomThought > GetThoughts () {return (fra t i _connection.Table < RandomThought > () velg t) .ToList (); } Public RandomThought GetThought (int id) {return _connection.Table < RandomThought > () .FirstOrDefault (T = > t.ID == id); } Public void DeleteThought (int id) {_connection.Delete < RandomThought > (id); } Public void AddThought (string tanke) {var newThought = new RandomThought {Thought = tanke, CreatedOn = DateTime.Now}; _connection.Insert (newThought); }}}
Trinn 4:. Tilsett iOS Implementering
bruker System; hjelp System.IO, bruker SQLite, bruker IntroToSQLite.iOS, bruker Xamarin.Forms; [forsamlingen: Avhengighet (typeof (SQLite_iOS))]. Navne IntroToSQLite.iOS {public class SQLite_iOS: ISQLite {offentlige SQLite_iOS () {} #region ISQLite implementering offentlig SQLite.Net.SQLiteConnection getConnection () {var filnavn = "RandomThought.db3"; Var documentsPath = Environment.GetFolderPath (Environment.SpecialFolder.Personal); Var libraryPath = Path.Combine (documentsPath, "..", "Library"); Var path = Path.Combine (libraryPath, filnavn); Var plattform = nye SQLite.Net.Platform.XamarinIOS.SQLitePlatformIOS (); Var forbindelse = new SQLite.Net.SQLiteConnection (plattform, bane); returnere tilkobling; } #endregion}}
Trinn 5:. Tilsett Android Gjennomføring
bruker System; hjelp System.IO, bruker Xamarin.Forms, bruker IntroToSQLite.Android [forsamlingen. Avhengighet (typeof (SQLite_Android)) ] navnerom IntroToSQLite.Android {public class SQLite_Android: ISQLite {public SQLite_Android () {} #region ISQLite implementering offentlig SQLite.Net.SQLiteConnection getConnection () {var filnavn = "RandomThought.db3"; Var documentsPath = Environment.GetFolderPath (Environment.SpecialFolder.Personal); Var path = Path.Combine (documentsPath, filnavn); Var plattform = new SQLite.Net.Platform.XamarinAndroid.SQLitePlatformAndroid (); Var forbindelse = new SQLite.Net.SQLiteConnection (plattform, bane); returnere tilkobling; } #endregion}}
Trinn 6:. Tilsett Windows Phone Implementering
bruker System; hjelp System.IO, bruker Xamarin.Forms, bruker IntroToSQLite.WinPhone [forsamlingen: Avhengighet (typeof (SQLite_WinPhone)]. Navnerom IntroToSQLite .WinPhone {public class SQLite_WinPhone: ISQLite {public SQLite_WinPhone () {} #region ISQLite implementering offentlig SQLite.Net.SQLiteConnection getConnection () {var filnavn = "RandomThought.db3"; Var path = Path.Combine (ApplicationData.Current.LocalFolder .Path, filnavn); Var plattform = new SQLite.Net.Platform.WindowsPhone8.SQLitePlatformWP8 (); Var forbindelse = new SQLite.Net.SQLiteConnection (plattform, bane), tilbake tilkobling;} #endregion}}
Trinn 7:.. Legge User Interface
Opprett Listview
bruker System; hjelp Xamarin.Forms; navne IntroToSQLite {public class RandomThoughtsPage: ContentPage {private RandomThoughtDatabase _database; private Listview _thoughtList; offentlig RandomThoughtsPage (RandomThoughtDatabase database) {_database = database; Title = "Random Thoughts"; Var tanker = _database.GetThoughts (); _thoughtList = new Listview (); _thoughtList.ItemsSource = tanker; _thoughtList.ItemTemplate = new DataTemplate (typeof (TextCell)); _thoughtList.ItemTemplate.SetBinding (TextCell.TextProperty, "Thought"); _thoughtList.ItemTemplate.SetBinding (TextCell.DetailProperty, "CreatedOn"); Var toolbarItem = new ToolbarItem {Name = "Legg til", Command = new Kommando (() = > Navigation.PushAsync (ny ThoughtEntryPage (dette, database)))}; ToolbarItems.Add (toolbarItem); Content = _thoughtList; } Public void Refresh () {_thoughtList.ItemsSource = _database.GetThoughts (); }}}
public static Side GetMainPage () {var database = new RandomThoughtDatabase (); returnere ny NavigationPage (ny RandomThoughtsPage (database));}
Lag på startsida
bruker System; hjelp Xamarin.Forms; navne IntroToSQLite {public class ThoughtEntryPage: ContentPage {private RandomThoughtsPage _parent; private RandomThoughtDatabase _database; offentlig ThoughtEntryPage (RandomThoughtsPage forelder, RandomThoughtDatabase database) {_parent = forelder; _database = database; Title = "Skriv inn en Thought"; Var entry = new Entry (); Var knapp = new Button {Text = "Legg til"}; button.Clicked + = async (objekt avsenderen, EventArgs e) = > {Var tanken = entry.Text; _database.AddThought (tanke); avvente Navigation.PopAsync (); _parent.Refresh (); }; Content = ny StackLayout {Mellomrom = 20, Padding = new Tykkelse (20), Barn = {oppføring, knappen}}; }}}
Taste Thoughts
Vise listen
Konklusjon