Adobe AIR中的 SQLite 數據庫簡介

由於項目需要,今天搞了一下sqlite,終於搞定類似於通過本地數據庫對登陸程序進行初始化配置,感覺sqlite確實太優秀了。下面是一個關於AIR和sqlite極不錯的文章。

Adobe AIR 包括一個基於 SQL 的關係數據庫引擎(sqlite),該引擎在運行時中運行,數據以本地方式存儲在運行 AIR 應用程序的計算機上的數據庫文件中(例如,在計算機的硬盤驅動器上)。由於數據庫的運行和數據文件的存儲都在本地進行,因此,不管網絡連接是否可用,AIR 應用程序都可以使用數據庫。

單個 Adobe AIR 本地 SQL 數據庫作爲單個文件存儲在計算機的文件系統中。運行時包括 SQL 數據庫引擎,該引擎管理數據庫文件的創建和結構化以及操作和檢索數據庫文件中的數據。運行時不指定在文件系統上存儲數據庫數據的方式或位置;相反,每個數據庫完全存儲在單個文件中。您指定在文件系統中存儲數據庫文件的位置。單個 AIR 應用程序可以訪問一個或多個單獨的數據庫(即單獨的數據庫文件)。由於運行時將每個數據庫作爲單個文件存儲在文件系統上,因此可以在需要時按照應用程序的設計和操作系統的文件訪問約束查找您的數據庫。每個用戶都可以具有其特定數據的單獨數據庫文件,或者數據庫文件可以由在單個計算機上共享數據的所有應用程序用戶訪問。由於數據對單個計算機是本地的,因此在不同計算機上的用戶之間並不自動共享數據。本地 SQL 數據庫引擎未提供對遠程數據庫或基於服務器的數據庫執行 SQL 語句的任何功能。

關於sqlite

關於SQLite的特性:

1. ACID事務

2. 零配置 – 無需安裝和管理配置

3. 儲存在單一磁盤文件中的一個完整的數據庫

4. 數據庫文件可以在不同字節順序的機器間自由的共享

5. 支持數據庫大小至2TB

6. 足夠小, 大致3萬行C代碼, 250K

7. 比一些流行的數據庫在大部分普通數據庫操作要快

8. 簡單, 輕鬆的API

9. 包含TCL綁定, 同時通過Wrapper支持其他語言的綁定

10. 良好註釋的源代碼, 並且有着90%以上的測試覆蓋率

11. 獨立: 沒有額外依賴

12. Source完全的Open, 你可以用於任何用途, 包括出售它

13. 支持多種開發語言,C, PHP, Perl, Java, ASP.NET,Python

更詳細情況可以參考以下站點:

http://www.sqlite.org/

http://www.sqlite.com.cn/

本地 SQL 數據庫的用途

AIR 本地 SQL 數據庫功能可以用於將應用程序數據存儲在用戶的本地計算機上的任何目的。Adobe AIR 包括在本地存儲數據的幾種機制,各機制具有不同的優點。以下是本地 SQL 數據庫在 AIR 應用程序中的一些可能用途:

1.對於面向數據的應用程序(例如通訊簿),數據庫可以用於存儲主應用程序數據。

2.對於面向文檔的應用程序(用戶創建要保存並可能共享的文檔),可以在用戶指定的位置將每個文檔另存爲數據庫文件。(但是,請注意,任何 AIR 應用程序都能夠打開數據庫文件,因此對於潛在敏感的文檔,建議使用單獨的加密機制。)

3.對於支持網絡的應用程序,數據庫可以用於存儲應用程序數據的本地緩存,或者在網絡連接不可用時暫時存儲數據。可以創建一種將本地數據庫與網絡數據存儲同步的機制。

4.對於任何應用程序,數據庫都可以用於存儲單個用戶的應用程序設置,例如用戶選項或應用程序信息(如窗口大小和位置)。

關於同步和異步執行模式

1.編寫代碼以處理本地 SQL 數據庫時,會指定以兩種執行模式之一執行數據庫操作:異步或同步執行模式。通常,代碼示例說明如何以這兩種方式執行每個操作,以便您可以使用最適合您需求的示例。

2.在異步執行模式中,爲運行時提供一個指令,運行時將在請求的操作完成或失敗時調度事件。首先,通知數據庫引擎執行操作。在應用程序繼續運行的同時,數據庫引擎在後臺工作。最後,完成操作時(或者它失敗時),數據庫引擎調度事件。由事件觸發的代碼執行後續操作。此方法具有一個重要的優點:運行時在後臺執行數據庫操作,同時主應用程序代碼繼續執行。如果數據庫操作花費大量的時間,則應用程序繼續運行。最重要的是,用戶可以繼續與其交互,而屏幕不會凍結。但是,與其它代碼相比,編寫異步操作代碼可能更加複雜。在必須將多個相關的操作分配給各個事件偵聽器方法的情況下,通常會出現此複雜性。

3.從概念上說,將操作作爲單個步驟序列(一組同步操作,而不是分到幾個事件偵聽器方法中的一組操作)進行編碼更爲簡單。除了異步數據庫操作外,Adobe AIR 還允許您同步執行數據庫操作。在同步執行模式中,操作不在後臺運行。相反,它們以與所有其它應用程序代碼相同的執行序列運行。通知數據庫引擎執行操作。然後,代碼在數據庫引擎工作時暫停。完成操作後,繼續執行下一行代碼。

4.異步還是同步執行操作是在 SQLConnection 級別上設置的。使用單個數據庫連接,無法同步執行某些操作或語句,同時異步執行其它操作或語句。通過調用 SQLConnection 方法打開數據庫,可以指定 SQLConnection 是在同步還是異步執行模式下操作。如果調用 SQLConnection.open(),則連接在同步執行模式下操作;如果調用 SQLConnection.openAsync(),則連接在異步執行模式下操作。使用 open() 或 openAsync() 將 SQLConnection 實例連接到數據庫後,除非先關閉再重新打開到數據庫的連接,否則該實例將固定爲同步或異步執行模式。

創建數據庫

若要創建數據庫文件,請首先創建 SQLConnection 實例。調用其 open() 方法在同步執行模式下打開它,或者調用其 openAsync() 方法在異步執行模式下打開它。open() 和 openAsync() 方法用於打開到數據庫的連接。如果傳遞的 File 實例引用 reference 參數(第一個參數)的不存在的文件位置,則 open() 或 openAsync() 方法將在該文件位置創建一個數據庫文件,並打開到新創建的數據庫的連接。

不管是調用 open() 方法還是 openAsync() 方法創建數據庫,數據庫文件的名稱都可以是具有任何文件擴展名的任何有效文件名。如果調用 reference 參數爲 null 的 open() 或 openAsync() 方法,則將創建新的內存中數據庫,而不是在磁盤上創建數據庫文件。

以下代碼清單說明使用異步執行模式創建數據庫文件(新數據庫)的過程,數據庫文件保存在應用程序的存儲目錄中,其文件名爲“myTestdb.db”:

import mx.controls.Alert;

private var con:SQLConnection;

private function initApp():void

{

var file:File = File.applicationStorageDirectory.resolvePath("myTestdb.db")

con = new SQLConnection();

//在 openAsync() 方法調用操作成功完成時調度

con.addEventListener(SQLEvent.OPEN,openHandler);

//SQLConnection 對象的異步操作導致錯誤時調度

con.addEventListener(SQLErrorEvent.ERROR,errorHandler);

con.openAsync(file);

}

private function openHandler(evt:SQLEvent):void

{

Alert.show("成功完成");

}

private function errorHandler(evt:SQLErrorEvent):void

{

Alert.show("失敗");

Alert.show(evt.error.message);

Alert.show(evt.error.details);

}

要同步執行操作,請在使用 SQLConnection 實例打開數據庫連接時,調用 open() 方法。以下代碼說明如何創建和打開同步執行其操作的 SQLConnection 實例:

import mx.controls.Alert;

private var con:SQLConnection;

private function initApp():void

{

var file:File = File.applicationStorageDirectory.resolvePath("myTestdb.db")

con = new SQLConnection();

try

{

   con.open(file);

   Alert.show("成功完成");

}

catch(error:SQLError)

{

   Alert.show(error.message);

   Alert.show(error.details);

}

}

創建數據庫表

以下使用異步執行模式在現有數據庫文件中創建一個名爲“emp”的表。

import mx.controls.Alert;

private var con:SQLConnection;

private var createStmt:SQLStatement;

private function initApp():void

{

var file:File = File.applicationStorageDirectory.resolvePath("myTestdb.db")

con = new SQLConnection();

//在 openAsync() 方法調用操作成功完成時調度

con.addEventListener(SQLEvent.OPEN,openHandler);

//SQLConnection 對象的異步操作導致錯誤時調度

con.addEventListener(SQLErrorEvent.ERROR,errorHandler);

con.openAsync(file);

}

private function createResult(event:SQLEvent):void

{

    Alert.show("表創建");

}

private function createError(event:SQLErrorEvent):void

{

    Alert.show("Error message:", event.error.message);

    Alert.show("Details:", event.error.details);

}

private function openHandler(evt:SQLEvent):void

{

Alert.show("成功完成");

createStmt = new SQLStatement();

createStmt.sqlConnection = con;

var sql:String =

    "CREATE TABLE IF NOT EXISTS emp (" +

    "    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 errorHandler(evt:SQLErrorEvent):void

{

Alert.show("失敗");

Alert.show(evt.error.message);

Alert.show(evt.error.details);

}

以下代碼使用同步執行模式在現有數據庫文件中創建一個名爲“emp”的表

import mx.controls.Alert;

private var con:SQLConnection;

private var createStmt:SQLStatement;

private function initApp():void

{

var file:File = File.applicationStorageDirectory.resolvePath("myTestdb.db")

con = new SQLConnection();

createStmt = new SQLStatement();

try

{

   con.open(file);

  

  

   createStmt.sqlConnection = con;

   var sql:String =

    "CREATE TABLE IF NOT EXISTS emp (" +

    "    empId INTEGER PRIMARY KEY AUTOINCREMENT, " +

    "    firstName TEXT, " +

    "    lastName TEXT, " +

    "    salary NUMERIC CHECK (salary > 0)" +

    ")";

   

createStmt.text = sql;

createStmt.execute();

   Alert.show("成功完成");

}

catch(error:SQLError)

{

   Alert.show(error.message);

   Alert.show(error.details);

}

}  

本文轉自:http://jsc0754.blog.163.com/blog/static/10389224520096308922522/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章