Tworzenie i modyfikowanie bazy danych

Adobe AIR 1.0 i starsze wersje

Zanim aplikacja będzie mogła dodać lub pobrać dane, konieczne jest utworzenie bazy danych zawierającej tabele, do których aplikacja będzie miała dostęp. W niniejszej sekcji opisano zadania tworzenia bazy danych, a także tworzenia struktury danych w bazie danych. Te zadania używane są rzadziej niż operacje wstawiania i pobierania danych, ale są konieczne dla większości aplikacji.

Tworzenie bazy danych

W celu utworzenia pliku bazy danych należy najpierw utworzyć instancję klasy SQLConnection . Następnie należy wywołać jej metodę open() , aby otworzyć w trybie wykonywania asynchronicznego, lub metodę openAsync() w celu otwarcia w trybie wykonywania synchronicznego. Metody open() i openAsync() są używane do otwarcia połączenia z bazą danych. W przypadku wprowadzenia instancji File, która odwołuje się do nieistniejącej lokalizacji pliku dla parametru reference (parametr pierwszy), metoda open() lub openAsync() tworzy plik bazy danych w tej lokalizacji pliku, a następnie otwiera połączenie z nowo utworzoną bazą danych.

Bez względu na to, czy w celu utworzenia bazy danych została wywołana metoda open() , czy metoda openAsync() , nazwa pliku bazy danych może być dowolną poprawną nazwą z dowolnym rozszerzeniem nazwy pliku. Jeśli metoda open() lub openAsync() zostanie wywołana z wartością null dla parametru reference , zostanie utworzona nowa baza danych (w pamięci), a nie plik bazy danych na dysku.

Poniższy fragment kodu przedstawia sposób tworzenia pliku bazy danych (nowej bazy danych) w trybie wykonywania asynchronicznego. W tym przypadku plik bazy danych jest zapisany w Wskazywanie na katalog zapisu aplikacji pod nazwą „DBSample.db”:

import flash.data.SQLConnection; 
import flash.events.SQLErrorEvent; 
import flash.events.SQLEvent; 
import flash.filesystem.File; 
     
var conn:SQLConnection = new SQLConnection(); 
     
conn.addEventListener(SQLEvent.OPEN, openHandler); 
conn.addEventListener(SQLErrorEvent.ERROR, errorHandler); 
     
// The database file is in the application storage directory 
var folder:File = File.applicationStorageDirectory; 
var dbFile:File = folder.resolvePath("DBSample.db"); 
     
conn.openAsync(dbFile); 
     
function openHandler(event:SQLEvent):void 
{ 
    trace("the database was created successfully"); 
} 
     
function errorHandler(event:SQLErrorEvent):void 
{ 
    trace("Error message:", event.error.message); 
    trace("Details:", event.error.details); 
} 
<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()"> 
    <mx:Script> 
        <![CDATA[ 
            import flash.data.SQLConnection; 
            import flash.events.SQLErrorEvent; 
            import flash.events.SQLEvent; 
            import flash.filesystem.File; 
             
            private function init():void 
            { 
                var conn:SQLConnection = new SQLConnection(); 
                 
                conn.addEventListener(SQLEvent.OPEN, openHandler); 
                conn.addEventListener(SQLErrorEvent.ERROR, errorHandler); 
                  
                // The database file is in the application storage directory 
                var folder:File = File.applicationStorageDirectory; 
                var dbFile:File = folder.resolvePath("DBSample.db"); 
                 
                conn.openAsync(dbFile); 
            } 
             
            private function openHandler(event:SQLEvent):void 
            { 
                trace("the database was created successfully"); 
            } 
             
            private function errorHandler(event:SQLErrorEvent):void 
            { 
                trace("Error message:", event.error.message); 
                trace("Details:", event.error.details); 
            } 
        ]]> 
    </mx:Script> 
</mx:WindowedApplication>
Uwaga: Mimo że klasa File umożliwia wskazanie pliku w konkretnej alternatywnej ścieżce, postępowanie takie może doprowadzić do nieprawidłowego działania aplikacji na różnych platformach. Na przykład ścieżka C:\Documents and Settings\janek\test.db jest prawidłowa tylko w systemie Windows. Dlatego najlepszym rozwiązaniem jest użycie procedur statycznych klasy File , takich jak File.applicationStorageDirectory , oraz metody resolvePath() (co ilustruje poprzedni przykład). Więcej informacji zawiera sekcja Ścieżki obiektów File .

W celu synchronicznego wykonywania operacji po otwarciu połączenia bazy danych za pomocą instancji SQLConnection należy wywołać metodę open() . Poniższy przykład przedstawia sposób tworzenia otwierania instancji SQLConnection, która wykonuje jej operacje synchronicznie:

import flash.data.SQLConnection; 
import flash.errors.SQLError; 
import flash.filesystem.File; 
     
var conn:SQLConnection = new SQLConnection(); 
     
// The database file is in the application storage directory 
var folder:File = File.applicationStorageDirectory; 
var dbFile:File = folder.resolvePath("DBSample.db"); 
     
try 
{ 
    conn.open(dbFile); 
    trace("the database was created successfully"); 
} 
catch (error:SQLError) 
{ 
    trace("Error message:", error.message); 
    trace("Details:", error.details); 
} 
<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()"> 
    <mx:Script> 
        <![CDATA[ 
            import flash.data.SQLConnection; 
            import flash.errors.SQLError; 
            import flash.filesystem.File; 
             
            private function init():void 
            { 
                var conn:SQLConnection = new SQLConnection(); 
                 
                // The database file is in the application storage directory 
                var folder:File = File.applicationStorageDirectory; 
                var dbFile:File = folder.resolvePath("DBSample.db"); 
                  
                try 
                { 
                    conn.open(dbFile); 
                    trace("the database was created successfully"); 
                } 
                catch (error:SQLError) 
                { 
                    trace("Error message:", error.message); 
                    trace("Details:", error.details); 
                } 
            } 
        ]]> 
    </mx:Script> 
</mx:WindowedApplication>

Tworzenie tabel bazy danych

Utworzenie tabeli w bazie danych obejmuje wykonanie instrukcji SQL w tej bazie danych, z wykorzystaniem tego samego procesu, którego używa się w celu wykonania instrukcji SQL, takiej jak SELECT , INSERT , itp. W celu utworzenia tabeli należy zastosować instrukcję CREATE TABLE , która zawiera definicje kolumn i ograniczeń dla nowej tabeli. Więcej informacji na temat wykonywania instrukcji SQL zawiera sekcja Praca z instrukcjami SQL .

Poniższy przykład demonstruje utworzenie tabeli o nazwie „employees” w istniejącym pliku bazy danych, przy wykorzystaniu trybu wykonywania asynchronicznego. W tym przykładzie przyjęto, że istnieje instancja klasy SQLConnection o nazwie conn , która jest już połączona z bazą danych.

import flash.data.SQLConnection; 
import flash.data.SQLStatement; 
import flash.events.SQLErrorEvent; 
import flash.events.SQLEvent; 
     
// ... create and open the SQLConnection instance named conn ... 
     
var createStmt:SQLStatement = new SQLStatement(); 
createStmt.sqlConnection = conn; 
     
var sql:String =  
    "CREATE TABLE IF NOT EXISTS employees (" +  
    "    empId INTEGER PRIMARY KEY AUTOINCREMENT, " +  
    "    firstName TEXT, " +  
    "    lastName TEXT, " +  
    "    salary NUMERIC CHECK (salary > 0)" +  
    ")"; 
createStmt.text = sql; 
     
createStmt.addEventListener(SQLEvent.RESULT, createResult); 
createStmt.addEventListener(SQLErrorEvent.ERROR, createError); 
     
createStmt.execute(); 
     
function createResult(event:SQLEvent):void 
{ 
    trace("Table created"); 
} 
     
function createError(event:SQLErrorEvent):void 
{ 
    trace("Error message:", event.error.message); 
    trace("Details:", event.error.details); 
}
<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()"> 
    <mx:Script> 
        <![CDATA[ 
            import flash.data.SQLConnection; 
            import flash.data.SQLStatement; 
            import flash.events.SQLErrorEvent; 
            import flash.events.SQLEvent; 
             
            private function init():void 
            { 
                // ... create and open the SQLConnection instance named conn ... 
                 
                var createStmt:SQLStatement = new SQLStatement(); 
                createStmt.sqlConnection = conn; 
                 
                var sql:String =  
                    "CREATE TABLE IF NOT EXISTS employees (" +  
                    "    empId INTEGER PRIMARY KEY AUTOINCREMENT, " +  
                    "    firstName TEXT, " +  
                    "    lastName TEXT, " +  
                    "    salary NUMERIC CHECK (salary > 0)" +  
                    ")"; 
                createStmt.text = sql; 
                 
                createStmt.addEventListener(SQLEvent.RESULT, createResult); 
                createStmt.addEventListener(SQLErrorEvent.ERROR, createError); 
                 
                createStmt.execute(); 
            } 
             
            private function createResult(event:SQLEvent):void 
            { 
                trace("Table created"); 
            } 
             
            private function createError(event:SQLErrorEvent):void 
            { 
                trace("Error message:", event.error.message); 
                trace("Details:", event.error.details); 
            } 
        ]]> 
    </mx:Script> 
</mx:WindowedApplication>

Poniższy przykład demonstruje sposób utworzenia tabeli o nazwie „employees” w istniejącym pliku bazy danych przy użyciu trybu wykonywania synchronicznego. W tym przykładzie przyjęto, że istnieje wystąpienie klasy SQLConnection o nazwie conn , które jest już połączone z bazą danych.

import flash.data.SQLConnection; 
import flash.data.SQLStatement; 
import flash.errors.SQLError; 
     
// ... create and open the SQLConnection instance named conn ... 
     
var createStmt:SQLStatement = new SQLStatement(); 
createStmt.sqlConnection = conn; 
     
var sql:String =  
    "CREATE TABLE IF NOT EXISTS employees (" +  
    "    empId INTEGER PRIMARY KEY AUTOINCREMENT, " +  
    "    firstName TEXT, " +  
    "    lastName TEXT, " +  
    "    salary NUMERIC CHECK (salary > 0)" +  
    ")"; 
createStmt.text = sql; 
     
try 
{ 
    createStmt.execute(); 
    trace("Table created"); 
} 
catch (error:SQLError) 
{ 
    trace("Error message:", error.message); 
    trace("Details:", error.details); 
} 
<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()"> 
    <mx:Script> 
        <![CDATA[ 
            import flash.data.SQLConnection; 
            import flash.data.SQLStatement; 
            import flash.errors.SQLError; 
             
            private function init():void 
            { 
                // ... create and open the SQLConnection instance named conn ... 
                 
                var createStmt:SQLStatement = new SQLStatement(); 
                createStmt.sqlConnection = conn; 
                 
                var sql:String =  
                    "CREATE TABLE IF NOT EXISTS employees (" +  
                    "    empId INTEGER PRIMARY KEY AUTOINCREMENT, " +  
                    "    firstName TEXT, " +  
                    "    lastName TEXT, " +  
                    "    salary NUMERIC CHECK (salary > 0)" +  
                    ")"; 
                createStmt.text = sql; 
                 
                try 
                { 
                    createStmt.execute(); 
                    trace("Table created"); 
                } 
                catch (error:SQLError) 
                { 
                    trace("Error message:", error.message); 
                    trace("Details:", error.details); 
                } 
            } 
        ]]> 
    </mx:Script> 
</mx:WindowedApplication>