5. Moment05 - GUI, API och datalagring

I detta moment skall vi jobba med GUI, API och datalagring. GUI används för att skapa mer användarvänliga applikationer och även om fokus under denna kurs är på spelutveckling så finns det många intressanta applikationer av andra typer som kan utvecklas. API är en teknik för att kunna dela data över internet. Datalagring kan göras på många olika sätt. Redan i förra momentet så skapade du och läste från textfiler när du jobbade med uppgiften att lagra HighScore. Nu skall vi kika på lite andra tekniker för datalagring.

5.1 GUI

I kursen Programmering01 så kikade vi lite snabbt på hur vi kan använda GUI (graphical user interface, grafiskt användargränssnitt) för att skapa mer användarvänliga applikationer. För att kunna bygga GUI i Python så var vi tvugna att importera något paket för att få tillgång till denna funktionalietet. I C# så är detta mer lättillgängligt och vi kommer också få tillgång till fler komponenter för att bygga våra applikationer. Det finns också ett bättre inbyggd stöd för att snabbt komma igång och bygga våra applikationer.

När det gäller C# så är det två olika tekniker som främst används för att bygga GUI, dels Winforms som är den som funnits längst och som anses enklast att komma igång med. WPF, Windows Presentation Foundation, ger bättre möjlighet att bygga mer avancerade användargränssnitt. De tutorials som finns nedan bygger alla på Winforms men för den som vill lära sig WPF och bygga sådana applikationer istället får absolut göra detta.

5.1.1 Tutorial CarGUI

Det bästa sättet att arbeta. Vi skall börja med en tutorial som bygger en grafisk variant av vårt tidigare arbete med Bil-/Fordonsapplikationerna.

Uppgift

Följ tutorial för att bygga ett GUI för att lagra våra bilar i en grafisk applikation.

Extrauppgift

Extrauppgifter hittar du på den speciella sidan för extrauppgifter.

5.2 API

API (Application Programming Interface) är ett gränssnitt som programmerare kan använda sig av för att kunna kommunicera mellan olika applikationer. Att använda API blir allt vanligare inom både programmering och webbutveckling då vi kan dela data som kan publiceras eller köpa data av varandra istället för alltid ta fram vårt egna data. SMHI/YR har ju redan samlat in data och gjort en prognos för hur vädret skall(kan) bli. Vill jag publicera denna informationen i mitt progam, min app eller på min hemsida så är det ju bättre att jag på något sätt får ta del av deras information. På samma sätt finns det möjlgihet att hämta info om Västtrafiks buss och tågavgångar samt om det finns någon trafikstörning. Vi kommer i detta momentet att jobba med ett API från biluppgifter.se som gör att vi kan hämta information om en specifik bil om vi anger bilens registreringsnummer. Detta kallas att vi gör ett GET-anrop för att hämta data, det finns också möjlighet att göra ett POST-anrop för olika API vilket då innebär att vi kan skicka data till en tjänst, t.ex. resultat från ett spel eller en temperaturangivelse från en av alla mätpunkter som finns utplacerade i världen.

Det finns mängder av API tillgängliga och vissa av dem hittar du litade här;

Det som är viktigt att tänka på när du hittar ett API som du känner att du vill använda är bla.

  • Vilken teknik kommunicerar med API? Vissa API kan endast kommuniera med vissa programmeringsspråk, det kan vara C#, JavaScript, PHP eller något annat som gäller. Ibland kanske inte det språk som du vill jobba med är kompatibelt med det valda API:et.
  • Vad får du göra med API? Vissa API är helt fria att göra vad du vill med medan andar har större eller mindre begränsningar av vad du får göra eller hur du skall meddela var informationen kommer ifrån. Var nogrann med att följa de regler som är uppsatta.
  • Är det ett öppet API eller behövs det en nyckel? Vissa API är öppna och då behöver du ingen nyckel för att kunna använda det medan andra API kräver nyckel som du får genom att ansöka om det, eller får genom att du skapar ett konto eller tom måste betala för det.

Så när du har hittat ett API som du vill jobba med, läs tydligt igenom vad du får och inte får göra.

5.2.1 Tutorial API biluppgifter.se

Denna tutorial är för tillfället tvådelad.

API-nyckel

Vi har fått tillgång till en API-nyckel av biluppgifter.se som vi har rätt att använda i undervisningssyfte. Denna nyckel ger begränsad information från deras databas och det är möjligt att göra 5000 sökningar per månad.

Klicka för att visa nyckeln!

JQ1c6bUMEC0doqzgASfZzeJ5DhckRgg6OQ2ard5NdtGKELWs57n61BfOahJv

Uppgift

Följ tutorial för att bygga ett bygga GUI med API för att hämta information om en bil.

Tillägg

När tutorial är färdig så har du fått reda på hur koden ser ut för att tömma utskriftstabellen på data. Bygg klart detta så att applikationen alltid fungerar som det gör när du söker efter första bilen.

Extrauppgift

Extrauppgifter hittar du på den speciella sidan för extrauppgifter.

5.3 Datalagring

Datalagring är en central del i all utvecking av applikationer oavsett vilken typ av applikation du utvecklar. I tidigare moment så lagrade du data för HighScore i en textfil som kunde skrivas till och läsas från. Att lagra data i en textfil är det enklaste sättet att lagra data och det fungerar bra när det är mindre data och/eller enklare data som skall lagras. Skall vi lagra större datamängder eller mer avancerad data, t.ex. information om elever på skolan eller en lista med information om 100 bilar så är det att föredra mer avancerade metoder för att lagra data.

5.3.1 Olika typer av datalagring

Alla typer av strukturerad lagring av data kommer behöva hanteras på något annat sätt än att bara lagra data på en fil även om vi har använt oss av någon typ av delimiter. Till slut så kommer vårt data vara svårare att hantera om det består av många olika värden.

5.3.2 JSON

JSON, JavaScript Object Notation, är en lagringsstruktur som används för att lagra och utbyta data mellan olika system. En stor fördel med JSON är att det är relativt lätt för våra ögon att läsa innehållet i filen. JSON har också en struktur som passar väldigt bra ihop med objekt då uppbyggnaden liknar varandra.

Kodexempel: lista med två bilar

[
  {
    "regNr": "ABC123",
    "make": "Volvo",
    "model": "V70",
    "year": 2012,
    "forSale": true
  },
  {
    "regNr": "DEF456",
    "make": "Saab",
    "model": "95",
    "year": 1999,
    "forSale": false
  }
]

Som du ser är det relativt enkelt att läsa denna strukturerade datamängden både för en människa och en dator. Vill du lära dig hur du lagrar och läser denna typ av data så finns det exempel under avsnittet Extrauppgift: Lagra objekt i fil. Att jobba med JSON-format är smidigt vid mindre datamängder. Skall vi bygga större system så kommer vi behöva hjälp av någon form av databashenterare som jobbar med denna typ av filer. Kortfattat kan man säga att problem med rena JSON-filer uppstår när enskilda objekt skall uppdateras då det fungerar på liknande sätt som när vi skall uppdatatera en rad i en fil.

5.3.3 XML

XML, Extensible Markup Language, är en lagringstruktur som också är relativt lättläst för både datorer och människor. Skillnaden mot JSON är att här används taggnotation istället. För de som kodat HTML tidigare så känns strukturen igen. Inne i ett element (tagg) så finns antingen andra element eller ett värde kopplat till detta element. Kikar vi på exemplet nedan så finns det ett element carList som innehållet tåv element car som i sin tur innehåller fem element var där själva informationen om bilen finns.

Kodexempel: lista med två bilar

<carList>
  <car>
    <regNr>ABC123</regNr>
    <make>Volvo</make>
    <model>V70</model>
    <year>2012</year>
    <forSale>true</forSale>
  </car>
  <car>
    <regNr>DEF456</regNr>
    <make>Saab</make>
    <model>95</model>
    <year>1999</year>
    <forSale>false</forSale>
  </car>
</carList>

Som du ser är strukturen väldigt tydlig och klassens utseende speglar sig bra även här. I bokens kapitel 10 finns det ett exempel där författaren bygger ett projekt där han jobbar med en lista av böcker som läses och lagras i XML-format för den som är intresserad av att testa.

5.3.4 Databaser

En databas är i grunden data som lagras på lämpligt sätt. Vi skulle kunna hävda att både JSON och XML fungerar som databaser men ofta menar vi en annan typ av funktion när vi pratar om databaser.

Här gäller det att förenkla så gott det går, databasen är ett stort område, och många tycker nog att jag förenklar väl mycket när jag säger att vi har två stora områden med databaser, SQL-databaser och NoSQL-databaser. En NoSQL-databas är en databas som inte lagrar data i den tabellform som är klassisk för SQL-databaser. Att lagra data som JSON-filer är typiskt för en NoSQL-databas. Det finns sedan olika typer av NoSQL-databaser som är anpassade för olika ändamål och som är olika duktiga på olika saker.

SQL-databaser är istället databaser som lagrar data i tabeller och skapar relationer mellan dessa tabeller. I denna del av kursen kommer vi jobba med denna typ av databaser.

5.4 Relationsdatabaser

I detta avsnitt kommer jag gå igenom den teori som du behöver för att förstå och kunna använda dig av någon SQL-databas, vars korrekta namn är relationsdatabaser. Det finns flera olika typer av relationsdatabaser som du kan komma att stöta på. Vi har SQL-server som är Microsofts databas som ofta ingår i .NET-projekt, MySQL är en annan databas som ofta används till webbapplikationer, Oracle (som numera äger rättigheterna till programspårket Java) är en kraftfull databas som ofta används när prestanda är viktigt och sedan har vi några mindre databaser där SQLite kanske är den mest använda. Alla dessa databaser har det gemensamt att de är relationsdatabaser och att grunden för datalagring är att data lagras i tabeller och att man kommer åt denna data genom att ställa frågor med frågespråket SQL (Structured Query Language).

5.4.1 Terminologi

För att lösa detta moment behöver vi lära oss terminiologin för databaser.

I en relationsdatabas så måste det finnas tabeller som på något sätt har en relation mellan varandra.

I varje tabell finns det rader, varje rad kallas post, och kolumner som kallas fält. Varje fält måste definieras där man talar om vilken datatyp och eventuell storlek som skall användas för detta fält.

Index skapas för att snabba på sökningar i en databas. För enklare databaser är det inte så viktigt att skapa egna index.

Ett fält, eller en kombination av fält, i varje tabell används som primärnyckel, primary key. Primärnycklar används för att unikt identifiera en post och är ansvarig för att det inte finns två poster med samma nyckel. En primärnyckel är en typ av index.

Tabellerna kopplas ihop genom att det som är primärnyckel i en tabell finns med som kopplande värde i en annan tabell, detta kallas då för främmande nyckel, foreign key.

När en databas skall skapas så bygger definitionerna av tabeller, fält och index upp ett schema. Varje schema lagras i en egen databas.

Vi använder frågespråket SQL - Structured Query Language för att en klient skall kunna kommunicera med databasen.

5.4.2 Tutorial med databas

Vi bygger vidare på applikationen med bilar och denna gången så skall vi lagra alla bilar i en databas så att bilarna finns kvar när vi startar applikationen nästa gång.

Uppgift

Följ tutorial för att bygga en databas för att lagra bilar och koppla detta till en applikation.

Extrauppgift

Extrauppgifter hittar du på den speciella sidan för extrauppgifter.

5.4.3 Fördjupning av databashantering

För den som är intresserad av att lära sig mer om databaser så finns det ett kunskapsdokument som går igenom hur man bygger bättre databaser, ställer bättre frågor och

Kunskapsdokument: SQLite