Informatie over lokale SQL-databases

Adobe AIR 1.0 of hoger

Lees voor een snelle uitleg en codevoorbeelden van het gebruik van SQL-databases, de volgende snelstartartikelen in de Adobe Developer Connection:

Adobe AIR bevat een op SQL gebaseerde engine voor relationele databases die binnen de runtime wordt uitgevoerd. De gegevens worden lokaal opgeslagen in databasebestanden op de computer waarop de AIR-toepassing wordt uitgevoerd (bijvoorbeeld de vaste schijf van de computer). Aangezien de database lokaal wordt uitgevoerd en de gegevensbestanden lokaal worden opgeslagen, kan een database altijd door een AIR-toepassing worden gebruikt, ongeacht of een netwerkverbinding aanwezig is. Dit betekent dat de lokale SQL-database-engine van de runtime een handige manier is om niet-vluchtige, lokale toepassingsgegevens op te slaan, met name als u ervaring hebt met SQL- en relationele databases.

Toepassingen voor lokale SQL-databases

De AIR-functies voor lokale SQL-databases kunnen worden gebruikt voor willekeurige toepassingen waarbij toepassingsgegevens moeten worden opgeslagen op de lokale computer van de gebruiker. Adobe AIR biedt verschillende manieren om gegevens lokaal op te slaan, waarbij elke manier andere voordelen heeft. Hieronder ziet u een aantal mogelijke toepassingen voor een lokale SQL-database in uw AIR-toepassing:

  • Voor een op gegevens gebaseerde toepassing (bijvoorbeeld een adresboek) kunt u een database gebruiken om de hoofdtoepassingsgegevens op te slaan.

  • Voor een op documenten gebaseerde toepassing (waarbij gebruikers documenten creëren om ze op te slaan en mogelijk te delen) kan elk document als een databasebestand worden opgeslagen op een door de gebruiker opgegeven locatie. (Houd er wel rekening mee dat als de database niet is gecodeerd, iedere AIR-toepassing in staat is het databasebestand te openen. Het is aan te raden mogelijk gevoelige documenten te coderen.)

  • Voor een toepassing met netwerkverbindingen kunt u een database gebruiken om toepassingsgegevens op te slaan in een lokale cache, of om gegevens tijdelijk op te slaan wanneer er geen netwerkverbinding beschikbaar is. U kunt desgewenst een procedure creëren om de lokale database te synchroniseren met de netwerklocatie voor gegevensopslag.

  • Voor alle toepassingen kunt u een database gebruiken om de toepassingsinstellingen van individuele gebruikers op te slaan, bijvoorbeeld gebruikersopties of toepassingsinformatie zoals venstergrootte en -positie.

Informatie over AIR-databases en databasebestanden

Een individuele, lokale SQL-database van Adobe AIR wordt als één bestand opgeslagen in het bestandssysteem van de computer. De runtime bevat de SQL-database-engine die het creëren en indelen van databasebestanden, en het bewerken en ophalen van gegevens in een databasebestand beheert. De runtime geeft niet aan hoe of waar de databasegegevens worden opgeslagen in het bestandssysteem - elke database bestaat uit één bestand. U geeft de locatie voor het databasebestand in het bestandssysteem op. Eén AIR-toepassing kan een of meer databases (met andere woorden aparte databasebestanden) benaderen. Aangezien de runtime elke database als één bestand opslaat in het bestandssysteem, kunt u de locatie van uw database afstemmen op het ontwerp van uw toepassing en de toegangsbeperkingen van het besturingssysteem. Iedere gebruiker kan een apart databasebestand voor zijn/haar specifieke gegevens hebben, of u kunt één databasebestand voor alle gebruikers van de toepassing op één computer plaatsen zodat de gegevens kunnen worden gedeeld. Aangezien de gegevens zich lokaal op één computer bevinden, worden de gegevens niet automatisch gedeeld met gebruikers op andere computers. De lokale SQL-database-engine biedt geen mogelijkheid om SQL-instructies uit te voeren in een externe of servergebaseerde database.

Informatie over relationele databases

Een relationele database is een mechanisme voor het opslaan (en ophalen) van gegevens op een computer. De gegevens zijn verdeeld in tabellen: rijen geven records of items weer, en kolommen (worden ook soms “velden” genoemd) verdelen elke record in individuele waarden. Een adresboektoepassing kan bijvoorbeeld een tabel met de naam “vrienden” bevatten. Elke rij van de tabel is dan één vriend die in de database is opgeslagen. De kolommen van de tabel bevatten gegevens zoals voornaam, achternaam, geboortedatum enzovoort. Voor iedere vriendrij van de tabel slaat de database een aparte waarde voor elke kolom op.

Relationele databases zijn ontworpen voor de opslag van complexe gegevens, waarbij een item is gekoppeld of gerelateerd aan items van een ander type. In een relationele database worden gegevens met een één-op-vele-relatie (waarbij één record kan zijn gekoppeld aan meerdere records van een ander type) doorgaans verdeeld over verschillende tabellen. Als u bijvoorbeeld uw adresboektoepassing wilt gebruiken om voor iedere vriend meerdere telefoonnummers op te slaan, is dat een één-op-vele-relatie. De tabel “vrienden” bevat in dat geval alle persoonlijke gegevens van iedere vriend. Een andere tabel, “telefoonnummers”, kan dan alle telefoonnummers van alle vrienden bevatten.

In de database worden niet alleen de gegevens van vrienden en telefoonnummers opgeslagen. Elke tabel heeft ook een gegevensitem nodig om de relatie tussen de twee tabellen bij te houden, met andere woorden om individuele vriendrecords te koppelen aan de overeenkomstige telefoonnummers. Dit gegevensitem wordt een primaire sleutel genoemd, een unieke identificator die elke tabelrij verschillend maakt van alle overige rijen uit die tabel. De primaire sleutel kan een “natuurlijke sleutel” zijn, waarbij de sleutel een van de gegevensitems is die elke record uit een tabel op een natuurlijke manier uniek maken. Als u in de tabel “vrienden” bijvoorbeeld weet dat al uw vrienden een andere geboortedatum hebben, kunt u de kolom voor de geboortedatum instellen als primaire sleutel (een natuurlijke sleutel) voor de tabel “vrienden”. Als er geen natuurlijke sleutel is, maakt u een afzonderlijke kolom met een primaire sleutel, zoals "vriend-id" — een kunstmatige waarde die de toepassing gebruikt om de rijen van elkaar te onderscheiden.

Met behulp van een primaire sleutel kunt u relaties tussen meerdere tabellen definiëren. Stel dat de tabel "vrienden" een kolom "vriend-id" heeft die voor elke rij een uniek getal (de vriend-id) bevat. De gerelateerde tabel “telefoonnummers” kan in twee kolommen worden verdeeld, één met de “id_vriend” van de vriend die het desbetreffende telefoonnummer heeft, en één met het daadwerkelijke telefoonnummer. Op die manier kunnen alle telefoonnummers, ongeacht het aantal telefoonnummers per vriend, worden opgeslagen in de tabel “telefoonnummers” en via de primaire sleutel “id_vriend” worden gekoppeld aan de overeenkomstige vriend. Wanneer de primaire sleutel van een tabel wordt gebruikt in een gerelateerde tabel om de relatie tussen de records aan te geven, wordt de waarde in de gerelateerde tabel een externe sleutel genoemd. In tegenstelling tot vele databases biedt de lokale database-engine van AIR niet de mogelijkheid om beperkingen voor externe sleutels in te stellen. Deze beperkingen controleren automatisch of een ingevoegde of bijgewerkte externe-sleutelwaarde overeenkomt met een rij in de tabel met de primaire sleutel. Relaties op basis van externe sleutels vormen echter een belangrijk onderdeel van de structuur van een relationele database, en u wordt aangeraden externe sleutels te gebruiken wanneer u relaties tussen de tabellen van uw database definieert.

Informatie over SQL

SQL (Structured Query Language) wordt bij relationele databases gebruikt om gegevens te bewerken en te zoeken. SQL is een beschrijvende en geen proceduretaal. Een SQL-instructie beschrijft de gegevensset die u zoekt maar geeft de computer geen instructies over hoe de gegevens moeten worden gezocht. De database-engine bepaalt hoe de gegevens worden gezocht.

De taal SQL is gestandaardiseerd door het ANSI (American National Standards Institute). De lokale SQL-database van Adobe AIR ondersteunt het grootste deel van de standaard SQL-92.

Zie SQL-ondersteuning in lokale databases voor specifieke beschrijvingen van de SQL-tall die wordt ondersteund in Adobe AIR.

Informatie over klassen van SQL-databases

Als u met lokale SQL-databases wilt werken in ActionScript 3.0, moet u instanties van deze klassen uit het pakket flash.data gebruiken:

Klasse

Beschrijving

flash.data.SQLConnection

Biedt de mogelijkheid om databases (databasebestanden) te maken en te openen, evenals methoden voor het uitvoeren van bewerkingen op databaseniveau en het besturen van databasetransacties.

flash.data.SQLStatement

Vertegenwoordigt één SQL-instructie (één query of opdracht) die op een database wordt uitgevoerd, inclusief het definiëren van de instructietekst en het instellen van parameterwaarden.

flash.data.SQLResult

Biedt een manier om informatie over of het resultaat van de uitvoering van een instructie op te vragen, zoals de resulterende rijen na een SELECT -instructie, het aantal rijen dat wordt beïnvloed door een UPDATE - of DELETE -instructie, enzovoort.

Als u schema-informatie met een beschrijving van de structuur van een database wilt verkrijgen, moet u deze klassen uit het pakket flash.data gebruiken:

Klasse

Beschrijving

flash.data.SQLSchemaResult

Fungeert als container voor databaseschemaresultaten die worden gegenereerd door het aanroepen van de methode SQLConnection.loadSchema() .

flash.data.SQLTableSchema

Biedt informatie over één tabel in een database.

flash.data.SQLViewSchema

Biedt informatie over één weergave in een database.

flash.data.SQLIndexSchema

Biedt informatie over één kolom van een tabel of weergave in een database.

flash.data.SQLTriggerSchema

Biedt informatie over één trigger van een database.

Andere klassen uit het pakket flash.data bieden constanten die worden gebruikt met de klassen SQLConnection en SQLColumnSchema:

Klasse

Beschrijving

flash.data.SQLMode

Definieert een set van constanten voor de mogelijke waarden van de parameter openMode van de methoden SQLConnection.open() en SQLConnection.openAsync() .

flash.data.SQLColumnNameStyle

Definieert een set van constanten voor de mogelijke waarden van de eigenschap SQLConnection.columnNameStyle .

flash.data.SQLTransactionLockType

Definieert een set van constanten voor de mogelijke waarden van de optieparameter van de methode SQLConnection.begin() .

flash.data.SQLCollationType

Definieert een set van constanten voor de mogelijke waarden van de eigenschap SQLColumnSchema.defaultCollationType en de parameter defaultCollationType van de constructor SQLColumnSchema() .

Daarnaast vertegenwoordigen de volgende klassen uit het pakket flash.events de gebeurtenissen (en ondersteunende constanten) die u gebruikt:

Klasse

Beschrijving

flash.events.SQLEvent

Definieert de gebeurtenissen die door een SQLConnection- of SQLStatement-instantie worden verzonden wanneer een of meer bewerkingen uit de instantie met succes zijn uitgevoerd. Voor elke bewerking is een gekoppelde gebeurtenistypeconstante gedefinieerd in de klasse SQLEvent.

flash.events.SQLErrorEvent

Definieert de gebeurtenis die door een SQLConnection- of SQLStatement-instantie wordt verzonden wanneer een of meer bewerkingen uit de instantie een fout opleveren.

flash.events.SQLUpdateEvent

Definieert de gebeurtenis die door een SQLConnection-instantie wordt verzonden wanneer tabelgegevens in een van de gekoppelde databases veranderen door de uitvoering van de SQL-instructie INSERT , UPDATE of DELETE .

Ten slotte bieden de volgende klassen uit het pakket flash.errors informatie over bewerkingsfouten in de database:

Klasse

Beschrijving

flash.errors.SQLError

Biedt informatie over een bewerkingsfout in de database, zoals de bewerking die is mislukt en de oorzaak van de fout.

flash.errors.SQLErrorOperation

Definieert een set van constanten voor de mogelijke waarden van de eigenschap operation van de klasse SQLError, die de databasebewerking aangeeft waarbij de fout is opgetreden.

Informatie over synchrone en asynchrone uitvoeringsmodi

Wanneer u code schrijft om met een lokale SQL-database te werken, selecteert u een van de twee beschikbare uitvoeringsmodi voor bewerkingen in de database: synchroon of asynchroon. De codevoorbeelden tonen op algemene manier hoe u elke bewerking op beide manieren kunt uitvoeren zodat u het voorbeeld kunt gebruiken dat het meest geschikt is voor uw behoeften.

In asynchrone uitvoeringsmodus geeft u de runtime een instructie, waarna de runtime een gebeurtenis verzendt wanneer de desbetreffende bewerking is voltooid of mislukt. Eerst geeft u de database-engine de opdracht een bewerking uit te voeren. De database-engine werkt op de achtergrond terwijl de toepassing verderwerkt. Wanneer ten slotte de bewerking is voltooid (of mislukt), verzendt de database-engine een gebeurtenis. Uw code, geactiveerd door de gebeurtenis, voert indien nodig daarop volgende bewerkingen uit. Deze procedure heeft een groot voordeel: de runtime voert de databasebewerkingen op de achtergrond uit terwijl de hoofdtoepassingscode verder wordt uitgevoerd. Als de databasebewerking lange tijd duurt, blijft de toepassing verderwerken. En het belangrijkste is dat interactie met de gebruiker mogelijk blijft omdat het scherm niet bevriest. Het nadeel is dat asynchrone bewerkingscode soms complexer is om te schrijven. Dit is doorgaans het geval wanneer meerdere afhankelijke bewerkingen moeten worden verdeeld tussen verschillende gebeurtenislistenermethoden.

Conceptueel is het eenvoudiger om bewerkingen als één sequentie van stappen (een set van synchrone bewerkingen) te beschrijven in plaats van als een set van bewerkingen verdeeld in meerdere gebeurtenislistenermethoden. Naast asynchrone databasebewerkingen is met Adobe AIR ook het synchroon uitvoeren van databasebewerkingen mogelijk. In de synchrone uitvoeringsmodus worden de bewerkingen niet op de achtergrond uitgevoerd. In plaats daarvan worden ze uitgevoerd volgens dezelfde uitvoeringssequentie als alle andere toepassingscode. U geeft de database-engine de opdracht een bewerking uit te voeren. Vervolgens wordt de code op dat punt onderbroken terwijl de database-engine zijn werk doet. Nadat de bewerking is voltooid, gaat de uitvoering verder vanaf de volgende regel van uw code.

U bepaalt op SQLConnection-niveau welke uitvoeringsmodus (synchroon of asynchroon) voor bewerkingen wordt gebruikt. Het is niet mogelijk om via één databaseverbinding bepaalde bewerkingen of instructies synchroon en andere asynchroon uit te voeren. U bepaalt welke uitvoeringsmodus (synchroon of asynchroon) voor een SQLConnection wordt gebruikt door een SQLConnection-methode op te roepen om de database te openen. Als u SQLConnection.open() oproept, werkt de verbinding in synchrone uitvoeringsmodus. Roept u SQLConnection.openAsync() op, dan werkt de verbinding in asynchrone uitvoeringsmodus. Nadat een SQLConnection-instantie met een database is verbonden met behulp van open() of openAsync() , wordt deze in synchrone of asynchrone uitvoeringsmodus vergrendeld, tenzij u de verbinding met de database sluit en weer opent.

Elke uitvoeringsmodus heeft specifieke voordelen. De meeste aspecten van beide modi zijn identiek. Er zijn echter bepaalde verschillen waarmee u het best rekening houdt terwijl u in een bepaalde modus werkt. Zie Synchrone en asynchrone databasebewerkingen gebruiken voor meer informatie over deze onderwerpen en suggesties voor het werken in elke modus.