Kode en NativeScript-applikasjon i sanntid SQLite

NativeScript er et rammeverk for å bygge opp mobile mobilprogrammer på tvers av plattformer ved hjelp av XML, CSS og JavaScript. I denne serien prøver vi noen av de kule tingene du kan gjøre med en NativeScript-app: geolocation og integrasjon av Google Maps, SQLite-database, Firebase-integrasjon og push-varsler. Underveis bygger vi et treningsprogram med sanntidsfunksjoner som vil bruke hver av disse funksjonene.

I denne opplæringen lærer du hvordan du integrerer en SQLite-database i appen for å lagre data lokalt. Spesielt lagrer vi dataene for gangavganger som vi samlet i den forrige opplæringen.

Hva du skal skape

Når du plukker opp fra forrige veiledning, legger du til en flippvisning for å vise de forskjellige delene av appen. Tidligere hadde vår app bare sporing siden, så vi trengte ikke faner. I dette innlegget legger vi til Walks side. Denne siden viser brukerens gange. Et nytt datapunkt vil bli lagt til her hver gang brukeren sporer sin gåsøkt. Det vil også være en funksjon for å rydde dataene.

Her er hva den endelige utgangen ser ut som:

Sette opp prosjektet

Hvis du har fulgt den forrige opplæringen på geolocation, kan du bare bruke det samme prosjektet og bygge funksjonene som vi skal legge til i denne opplæringen. Ellers kan du opprette et nytt prosjekt og kopiere startfilene til prosjektet ditt app mappe.

tns lage fitApp --appid "com.yourname.fitApp"

Deretter må du også installere geolocation og Google Maps plugins:

tns plugin legg til nativcript-geolocation tns plugin legg til nativescript-google-maps-sdk

Når du er installert, må du konfigurere Google Maps-plugin-modulen. Du kan lese de komplette instruksjonene om hvordan du gjør dette ved å lese delen på Installerer Google Maps Plugin i den forrige opplæringen.

Når alle disse er ferdige, bør du være klar til å følge med denne opplæringen.

Kjører prosjektet

Du kan kjøre prosjektet ved å kjøre tns kjøre android. Men siden denne appen vil bygge på geolokalitetsfunksjonaliteten, anbefaler jeg at du bruker en GPS-emulator for raskt å sette inn og endre posisjonen din. Du kan lese om hvordan du gjør det i seksjonen på Kjører appen i den forrige opplæringen. 

Installere SQLite Plugin

Det første du må gjøre for å begynne å jobbe med SQLite, er å installere plugin:

tns plugin legge til nativcript-sqlite

Dette lar deg gjøre ting som å koble til en database og gjøre CRUD (opprette, lese, oppdatere, slette) operasjoner på den.

Koble til databasen

Åpne hoved page.js fil og importer SQLite-plugin:

var Sqlite = krever ("nativescript-sqlite");

Du kan nå koble til databasen:

var db_name = "walks.db"; ny Sqlite (db_name) .then (db => // neste: opprett tabell for lagring av går data, error => );

De walks.db filen ble opprettet fra terminalen ved hjelp av ta på kommando, så det er bare en tom fil. Kopier det inn i app mappe.

Hvis det er vellykket tilkoblet, vil løftets løsefunksjon bli utført. Innenfor driver vi SQL-setningen for å skape vandringer bord. For å holde ting enkelt, er alt vi trenger å lagre den totale avstanden dekket (i meter) og de totale trinnene, samt start og slutt tidstempler. 

db.execSQL ("CREATE TABLE Hvis ikke EXISTS går i gang (ID INTEGER PRIMARY KEY AUTOINCREMENT, total_distance INTEGER, total_steg INTEGER, start_datetime DATETIME, end_datetime DATETIME)"), deretter (id => page.bindingContext = createViewModel (db); error => console.log ("CREATE TABLE ERROR", feil););

Når spørringen utføres vellykket, passerer vi databasen forekomsten (db) i sidekonteksten. Dette vil tillate oss å bruke det fra Hoved-view-model.js filen senere.

Henter data

Nå er vi klare til å jobbe med dataene. Men siden vi skal jobbe med datoer, må vi først installere et bibliotek kalt fecha. Dette gjør at vi enkelt kan analysere og formatere datoer:

npm installere - lagre fecha

Når den er installert, åpner du Hoved-view-model.js fil og ta med biblioteket:

var fecha = krever ('fecha');

Neste er koden for å sjekke om geolocation er aktivert. Først opprett en variabel (walk_id) for å lagre ID-en av en walking-plate. Vi trenger dette fordi appen umiddelbart legger inn en ny walk-record i vandringer bord når brukeren starter plasseringssporing. walk_id vil lagre IDen som automatisk genereres av SQLite, slik at vi kan oppdatere platen når brukeren slutter å spore.

var walk_id;

Deretter får du den nåværende måneden og året. Vi bruker det til å spørre bordet, slik at det bare returnerer poster som er i samme måned og år. Dette tillater oss å begrense antall poster som vises i brukergrensesnittet.

var måned = fecha.format (ny dato (), 'MM'); //e.g 07 var år = fecha.format (ny dato (), 'ÅÅÅÅ'); //e.g 2017

Vi trenger også en variabel for lagring av starttidstempel. Vi bruker det senere til å oppdatere brukergrensesnittet. Dette skyldes at vi bare spørre bordet en gang når appen er lastet, så vi må manuelt oppdatere brukergrensesnittet til nye data som blir tilgjengelige. Og siden starttidstempelet bare vil ha en verdi når brukeren begynner å spore, må vi initialisere den utenfor omfanget slik at vi kan oppdatere eller få tilgang til verdien senere.

var st_datetime; // start datetime

Initialiser turdataene som skal vises i brukergrensesnittet:

var går = []; viewModel.walks = []; viewModel.has_walks = false; 

Få dataene fra vandringer bord ved hjelp av alle() metode. Her leverer vi måneden og året som spørringsparametere. De strftime () funksjonen brukes til å trekke ut måneden og årdelen av start_datetime

db.all ("SELECT * FROM walks WHERE strftime ('% m', start_datetime) ==? OG strftime ('% Y', start_datetime) ==? BESTILL AV start_datetime DESC", [måned, år]) .then (feil, rs) => hvis (! err) // neste: Oppdater brukergrensesnittet med turdataene);

Når et suksessrespons er returnert, går vi gjennom resultatsettet slik at vi kan formatere dataene riktig. Vær oppmerksom på at indeksene der vi får tilgang til de enkelte verdiene avhenger av tabellstrukturen som ble beskrevet tidligere i hoved page.js fil. Den første kolonnen er ID, den andre er den totale avstanden, og så videre.

De formaterte dataene blir deretter presset til vandringer array og brukes til å oppdatere brukergrensesnittet. has_walks brukes som en bytte for brukergrensesnittet slik at vi kan vise eller skjule ting basert på verdien.

rs.forEach ((w) => let start_datetime = ny Dato (w [3]); la end_datetime = ny Dato (w [4]); walks.push (start: fecha.format (start_datetime, 'MMM D , h: mm '), / / ​​f.eks. 5. juni kl. 5:30: fecha.format (end_datetime,' h: mm a '), / / ​​f.eks 6:30 pm avstand: commafy (w [1]) + m ', // f.eks. 2000m trinn: commafy (w [2]) // f.eks 2.300);); hvis (walks.length) viewModel.set ('has_walks', true);  viewModel.set ('går', går);

Dette vil levere dataene til Listevisninghoved page.xml fil:

     

Lagre data

Når brukeren begynner å spore, må du stille inn gjeldende datetime som start_datetime og sett inn innledende verdier i tabellen ved hjelp av execSQL () funksjon. Akkurat som alle() funksjon, forventer dette SQL-spørringen som det første argumentet og en rekke parametre som den andre.

Hvis spørringen er vellykket, skal den returnere den automatisk genererte IDen for den innsatte posten. Vi tilordner det da som verdien for walk_id så det kan brukes senere til å oppdatere denne spesifikke posten.

st_datetime = ny dato (); var start_datetime = fecha.format (st_datetime, 'ÅÅÅÅ-MM-DD HH: mm: ss'); db.execSQL ("INSERT INT walks (total_distance, total_steps, start_datetime) VALUES (?,?,?)", [0, 0, start_datetime]) .then ((id) => walk_id = id; ) => dialogs.alert (e.message););

Når brukeren stopper sporing, får vi igjen det nåværende tidsstempelet og formaterer det tilsvarende for lagring:

var ed_datetime = ny dato (); var end_datetime = fecha.format (ed_datetime, 'ÅÅÅÅ-MM-DD HH: mm: ss');

Siden vi har bestilt resultatene fra de fleste til de minste, bruker vi avskifte () (i stedet for trykk()) for å legge til det nye elementet øverst på vandringer matrise.

walks.unshift (start: fecha.format (st_datetime, 'MMM D, h: mm'), slutt: fecha.format (ed_datetime, 'h: mm a'), avstand: commafy (total_distance) + 'm' trinn: commafy (total_steps)); viewModel.set ('går', går); hvis (walks.length> 0) viewModel.set ('has_walks', true); 

Deretter bruker vi igjen en gang til execSQL () funksjon for å oppdatere posten som vi satt inn tidligere:

db.execSQL ("UPDATE går SET end_datetime =?, total_steps =?, total_distance =? WHERE id =?", [end_datetime, total_steps, total_distance, walk_id]) .then ((err, id) =>  ) // todo: legg til kode for å tilbakestille sporingsgrensesnittet her);

Pass på å flytte koden for å tilbakestille sporingsgrensesnittet (for å tilbakestille totalavstanden og trinnene) inne i løfteoppløsningsfunksjonen, slik at du enkelt kan teste om oppdateringsspørsmålet ble utført eller ikke. 

Clearing Data

Sletting av data er gjort ved å klikke på Slett data knappen under listen over gange data:

...  

I Hoved-view-model.js fil, legg til koden for å slette alle dataene fra vandringer bord. Hvis du er vant til MySQL, kan du lure på hvorfor vi bruker SLETT spørringen i stedet for avkorte for å tømme bordet. Vel, det er fordi SQLite ikke har avkorte funksjon. Det er derfor vi må bruke SLETT spørring uten å levere en betingelse slik at den vil slette alle postene som for tiden er i tabellen. 

viewModel.clearData = function () dialogs.confirm ("Er du sikker på at du vil slette dataene dine?"). da ((enig) => hvis (enig) db.execSQL ("DELETE FROM walks" ]). da ((err) => hvis (! err) dialogs.alert ("Data har blitt fjernet!"); Walks = []; viewModel.set ('walks', []); viewModel.set ('has_walks', false););); 

Konklusjon

I denne opplæringen har du lært hvordan du lokalt lagrer data i NativeScript-appene dine ved hjelp av SQLite-plugin. Som du har sett, lar SQLite deg å gjenbruke eksisterende SQL-ferdigheter i å administrere en lokal database. Det er viktig å merke seg at ikke alle funksjoner som du er vant til i MySQL støttes i SQLite. Så det er alltid lurt å konsultere dokumentasjonen hvis du ikke er sikker på om en bestemt funksjon støttes eller ikke. 

Hvis du vil lære om andre alternativer for lagring av data i NativeScript-apper, anbefaler jeg at du leser denne artikkelen om Going Offline med NativeScript.

I den siste innlegget i denne serien legger vi til push-varsler til appen vår.

I mellomtiden kan du sjekke ut noen av våre andre innlegg på NativeScript og mobil plattform på tvers av plattformer.

For en omfattende introduksjon til NativeScript, prøv vårt videokurs Kode en mobilapp med NativeScript. I dette kurset vil Keyvan Kasaei vise deg trinnvis hvordan du bygger en enkel applikasjon. Underveis lærer du hvordan du implementerer en enkel app-arbeidsflyt med nettverksforespørsler, en MVVM-arkitektur og noen av de viktigste NativeScript-UI-komponentene. På slutten forstår du hvorfor du bør vurdere NativeScript for ditt neste mobilapprojekt.