亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

AIR 創(chuàng)建數(shù)據(jù)庫和表,以及同步和異步執(zhí)行模式

系統(tǒng) 2098 0

本章主要總結(jié)關(guān)系數(shù)據(jù)庫引擎 (sqlite), 同步和異步執(zhí)行模式 , 創(chuàng)建數(shù)據(jù)庫和表

?

Adobe AIR 包括一個基于 SQL 的關(guān)系數(shù)據(jù)庫引擎 (sqlite) ,該引擎在運行時中運行,數(shù)據(jù)以本地方式存儲在運行 AIR 應(yīng)用程序的計算機上的數(shù)據(jù)庫文件中(例如,在計算機的硬盤驅(qū)動器上)。由于數(shù)據(jù)庫的運行和數(shù)據(jù)文件的存儲都在本地進行,因此,不管網(wǎng)絡(luò)連接是否可用, AIR 應(yīng)用程序都可以使用數(shù)據(jù)庫。
單個 Adobe AIR 本地 SQL 數(shù)據(jù)庫作為單個文件存儲在計算機的文件系統(tǒng)中。運行時包括 SQL 數(shù)據(jù)庫引擎,該引擎管理數(shù)據(jù)庫文件的創(chuàng)建和結(jié)構(gòu)化以及操作和檢索數(shù)據(jù)庫文件中的數(shù)據(jù)。運行時不指定在文件系統(tǒng)上存儲數(shù)據(jù)庫數(shù)據(jù)的方式或位置;相反,每個數(shù)據(jù)庫完全存儲在單個文件中。您指定在文件系統(tǒng)中存儲數(shù)據(jù)庫文件的位置。單個 AIR 應(yīng)用程序可以訪問一個或多個單獨的數(shù)據(jù)庫(即單獨的數(shù)據(jù)庫文件)。由于運行時將每個數(shù)據(jù)庫作為單個文件存儲在文件系統(tǒng)上,因此可以在需要時按照應(yīng)用程序的設(shè)計和操作系統(tǒng)的文件訪問約束查找您的數(shù)據(jù)庫。每個用戶都可以具有其特定數(shù)據(jù)的單獨數(shù)據(jù)庫文件,或者數(shù)據(jù)庫文件可以由在單個計算機上共享數(shù)據(jù)的所有應(yīng)用程序用戶訪問。由于數(shù)據(jù)對單個計算機是本地的,因此在不同計算機上的用戶之間并不自動共享數(shù)據(jù)。本地 SQL 數(shù)據(jù)庫引擎未提供對遠程數(shù)據(jù)庫或基于服務(wù)器的數(shù)據(jù)庫執(zhí)行 SQL 語句的任何功能。

?

關(guān)于 sqlite
關(guān)于 SQLite 的特性 :
1. ACID
事務(wù)

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

3.
儲存在單一磁盤文件中的一個完整的數(shù)據(jù)庫

4.
數(shù)據(jù)庫文件可以在不同字節(jié)順序的機器間自由的共享

5.
支持數(shù)據(jù)庫大小至
2TB
6.
足夠小 , 大致 3 萬行 C 代碼
, 250K
7.
比一些流行的數(shù)據(jù)庫在大部分普通數(shù)據(jù)庫操作要快

8.
簡單 , 輕松的
API
9.
包含 TCL 綁定 , 同時通過 Wrapper 支持其他語言的綁定

10.
良好注釋的源代碼 , 并且有著 90% 以上的測試覆蓋率

11.
獨立 : 沒有額外依賴

12.
Source完全的Open, 你可以用于任何用途, 包括出售它
13. 支持多種開發(fā)語言,C, PHP, Perl, Java, ASP.NET,Python

更詳細情況可以參考以下站點:
http://www.sqlite.org/

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

?


本地 SQL 數(shù)據(jù)庫的用途
AIR
本地 SQL 數(shù)據(jù)庫功能可以用于將應(yīng)用程序數(shù)據(jù)存儲在用戶的本地計算機上的任何目的。 Adobe AIR 包括在本地存儲數(shù)據(jù)的幾種機制,各機制具有不同的優(yōu)點。以下是本地 SQL 數(shù)據(jù)庫在 AIR 應(yīng)用程序中的一些可能用途:
1.
對于面向數(shù)據(jù)的應(yīng)用程序(例如通訊簿),數(shù)據(jù)庫可以用于存儲主應(yīng)用程序數(shù)據(jù)。
2.
對于面向文檔的應(yīng)用程序(用戶創(chuàng)建要保存并可能共享的文檔),可以在用戶指定的位置將每個文檔另存為數(shù)據(jù)庫文件。(但是,請注意,任何 AIR 應(yīng)用程序都能夠打開數(shù)據(jù)庫文件,因此對于潛在敏感的文檔,建議使用單獨的加密機制。)
3.
對于支持網(wǎng)絡(luò)的應(yīng)用程序,數(shù)據(jù)庫可以用于存儲應(yīng)用程序數(shù)據(jù)的本地緩存,或者在網(wǎng)絡(luò)連接不可用時暫時存儲數(shù)據(jù)。可以創(chuàng)建一種將本地數(shù)據(jù)庫與網(wǎng)絡(luò)數(shù)據(jù)存儲同步的機制。
4.
對于任何應(yīng)用程序,數(shù)據(jù)庫都可以用于存儲單個用戶的應(yīng)用程序設(shè)置,例如用戶選項或應(yīng)用程序信息(如窗口大小和位置)。

?

關(guān)于同步和異步執(zhí)行模式
1.
編寫代碼以處理本地 SQL 數(shù)據(jù)庫時,會指定以兩種執(zhí)行模式之一執(zhí)行數(shù)據(jù)庫操作:異步或同步執(zhí)行模式。通常,代碼示例說明如何以這兩種方式執(zhí)行每個操作,以便您可以使用最適合您需求的示例。
2.
在異步執(zhí)行模式中,為運行時提供一個指令,運行時將在請求的操作完成或失敗時調(diào)度事件。首先,通知數(shù)據(jù)庫引擎執(zhí)行操作。在應(yīng)用程序繼續(xù)運行的同時,數(shù)據(jù)庫引擎在后臺工作。最后,完成操作時(或者它失敗時),數(shù)據(jù)庫引擎調(diào)度事件。由事件觸發(fā)的代碼執(zhí)行后續(xù)操作。此方法具有一個重要的優(yōu)點:運行時在后臺執(zhí)行數(shù)據(jù)庫操作,同時主應(yīng)用程序代碼繼續(xù)執(zhí)行。如果數(shù)據(jù)庫操作花費大量的時間,則應(yīng)用程序繼續(xù)運行。最重要的是,用戶可以繼續(xù)與其交互,而屏幕不會凍結(jié)。但是,與其它代碼相比,編寫異步操作代碼可能更加復(fù)雜。在必須將多個相關(guān)的操作分配給各個事件偵聽器方法的情況下,通常會出現(xiàn)此復(fù)雜性。
3.
從概念上說,將操作作為單個步驟序列(一組同步操作,而不是分到幾個事件偵聽器方法中的一組操作)進行編碼更為簡單。除了異步數(shù)據(jù)庫操作外, Adobe AIR 還允許您同步執(zhí)行數(shù)據(jù)庫操作。在同步執(zhí)行模式中,操作不在后臺運行。相反,它們以與所有其它應(yīng)用程序代碼相同的執(zhí)行序列運行。通知數(shù)據(jù)庫引擎執(zhí)行操作。然后,代碼在數(shù)據(jù)庫引擎工作時暫停。完成操作后,繼續(xù)執(zhí)行下一行代碼。
4.
異步還是同步執(zhí)行操作是在 SQLConnection 級別上設(shè)置的。使用單個數(shù)據(jù)庫連接,無法同步執(zhí)行某些操作或語句,同時異步執(zhí)行其它操作或語句。通過調(diào)用 SQLConnection 方法打開數(shù)據(jù)庫,可以指定 SQLConnection 是在同步還是異步執(zhí)行模式下操作。如果調(diào)用 SQLConnection.open() ,則連接在同步執(zhí)行模式下操作;如果調(diào)用 SQLConnection.openAsync() ,則連接在異步執(zhí)行模式下操作。使用 open() openAsync() SQLConnection 實例連接到數(shù)據(jù)庫后,除非先關(guān)閉再重新打開到數(shù)據(jù)庫的連接,否則該實例將固定為同步或異步執(zhí)行模式。

?

創(chuàng)建數(shù)據(jù)庫
若要創(chuàng)建數(shù)據(jù)庫文件,請首先創(chuàng)建 SQLConnection 實例。調(diào)用其 open() 方法在同步執(zhí)行模式下打開它,或者調(diào)用其 openAsync() 方法在異步執(zhí)行模式下打開它。open() 和 openAsync() 方法用于打開到數(shù)據(jù)庫的連接。如果傳遞的 File 實例引用 reference 參數(shù)(第一個參數(shù))的不存在的文件位置,則 open() 或 openAsync() 方法將在該文件位置創(chuàng)建一個數(shù)據(jù)庫文件,并打開到新創(chuàng)建的數(shù)據(jù)庫的連接。
不管是調(diào)用 open() 方法還是 openAsync() 方法創(chuàng)建數(shù)據(jù)庫,數(shù)據(jù)庫文件的名稱都可以是具有任何文件擴展名的任何有效文件名。如果調(diào)用 reference 參數(shù)為 null open() openAsync() 方法, 則將創(chuàng)建新的內(nèi)存中數(shù)據(jù)庫,而不是在磁盤上創(chuàng)建數(shù)據(jù)庫文件

以下代碼清單說明使用 異步執(zhí)行 模式創(chuàng)建數(shù)據(jù)庫文件(新數(shù)據(jù)庫)的過程 , 數(shù)據(jù)庫文件保存在應(yīng)用程序的存儲目錄中,其文件名為 “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() 方法調(diào)用操作成功完成時調(diào)度
?con.addEventListener(SQLEvent.OPEN,openHandler);
?//SQLConnection 對象的異步操作導(dǎo)致錯誤時調(diào)度
?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);
}


同步執(zhí)行 操作,請在使用 SQLConnection 實例打開數(shù)據(jù)庫連接時,調(diào)用 open() 方法。以下代碼說明如何創(chuàng)建和打開同步執(zhí)行其操作的 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);
?}
}

?

創(chuàng)建數(shù)據(jù)庫表
以下使用 異步執(zhí)行 模式在現(xiàn)有數(shù)據(jù)庫文件中創(chuàng)建一個名為 “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() 方法調(diào)用操作成功完成時調(diào)度
?con.addEventListener(SQLEvent.OPEN,openHandler);
?//SQLConnection 對象的異步操作導(dǎo)致錯誤時調(diào)度
?con.addEventListener(SQLErrorEvent.ERROR,errorHandler);
?
?con.openAsync(file);
}

private function createResult(event:SQLEvent):void
{
??? Alert.show("表創(chuàng)建");
}

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);
}


以下代碼使用 同步執(zhí)行 模式在現(xiàn)有數(shù)據(jù)庫文件中創(chuàng)建一個名為“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://files.cnblogs.com/aierong/Air_Test_SQLite.rar

?

?

本章主要總結(jié)數(shù)據(jù)庫的插入,刪除,修改,以及語句參數(shù)的使用
本章提到的同步和異步操作,不明白的可以看上篇文章
http://www.cnblogs.com/aierong/archive/2009/01/22/flex_Sqlite_1.html

?

0.SQLStatement類介紹
SQLStatement實例用于針對通過 SQLConnection 實例打開的本地 SQL 數(shù)據(jù)庫執(zhí)行 SQL 語句。
SQLStatement實例通過將 SQLConnection 實例設(shè)置為 SQLStatement 實例的 sqlConnection 屬性的值來鏈接到 SQLConnection 實例。
text 屬性用要執(zhí)行的 SQL 語句的實際文本進行填充。如有必要,可以使用 parameters 屬性指定 SQL 語句參數(shù)的值,并通過調(diào)用 execute() 方法執(zhí)行該語句。


1.
插入數(shù)據(jù)
同步版本:
import mx.controls.Alert;
private var con:SQLConnection;

private function initApp():void
{
?var file:File = File.applicationStorageDirectory.resolvePath("myTestdb.db")
?
?con = new SQLConnection();
?var stmt:SQLStatement = new SQLStatement();
?
?try
?{
??con.open(file);
??
??stmt.sqlConnection = con;
??stmt.text="INSERT INTO emp (firstName, lastName, salary) VALUES ('f', 'l', 88)";
??stmt.execute();
?}
?catch(error:SQLError)
?{
??Alert.show(error.message);
??Alert.show(error.details);
?}
}
代碼說明:
SQLStatement類的實例用于針對通過 SQLConnection 實例打開的本地 SQL 數(shù)據(jù)庫執(zhí)行 SQL 語句

?

2.得到已插入行的數(shù)據(jù)庫生成的行標識
得到自動增長列的行標識數(shù)值
var stmt:SQLStatement = new SQLStatement();
stmt.sqlConnection = con;
stmt.text="INSERT INTO emp (firstName, lastName, salary) VALUES ('f', 'l', 88)";
stmt.execute();
?
var result:SQLResult = stmt.getResult();
var primaryKey:Number = result.lastInsertRowID;
???
Alert.show(primaryKey.toString());
代碼說明:
SQLResult 類提供對為響應(yīng) SQL 語句(SQLStatement 實例)執(zhí)行而返回的數(shù)據(jù)的訪問
lastInsertRowID屬性:上次生成的行標識符(由 SQL INSERT 語句生成),如果執(zhí)行的語句不是 INSERT 語句,則該值為 0。

?

3. 語句參數(shù)的使用
在多次使用一個 SQL 語句但該語句中的值不同的情況下,最佳方法是使用包括參數(shù)的 SQL 語句而不是在 SQL 文本中包括字面值。參數(shù)是語句文本中的一個占位符,每次執(zhí)行語句時都將它替換為實際的值。
參數(shù)名稱由 “:” “@” 字符后跟一個名稱組成,例如: :itemName? @firstName
還可以使用未命名參數(shù),使用 “?” 字符表示 SQL 語句中的參數(shù)。按照參數(shù)在語句中的順序,每個參數(shù)都分配有一個數(shù)字索引,數(shù)字索引從索引 0 (表示第一個參數(shù))開始。

使用參數(shù)的優(yōu)點 :
1.
性能更佳
2.
顯式數(shù)據(jù)類型指定
3.
安全性更高

實例代碼:得到自動增長列的行標識數(shù)值( 異步版本
private var stmt1:SQLStatement;
private function GetlastInsertRowID():void
{
?stmt1 = new SQLStatement();
?stmt1.sqlConnection = con;
?
?stmt1.text="INSERT INTO emp (firstName, lastName, salary) VALUES (@firstName, @lastName, @salary)";
?stmt1.parameters["@firstName"]="f";
?stmt1.parameters["@lastName"]="l";
?stmt1.parameters["@salary"]=88;?
?
?stmt1.addEventListener(SQLEvent.RESULT,okHandler);
?stmt1.addEventListener(SQLErrorEvent.ERROR,errorHandler);
?stmt1.execute();
}

private function okHandler(evt:SQLEvent):void
{
?Alert.show("插入成功");
?var re:SQLResult= this.stmt1.getResult();
?var id:Number=re.lastInsertRowID;
?Alert.show(id.toString());
}

private function errorHandler(evt:SQLErrorEvent):void
{
?Alert.show("失敗");
?Alert.show(evt.error.message);
?Alert.show(evt.error.details);
}
代碼說明:
此例題中用到了語句參數(shù)@firstName, @lastName, @salary,并分別賦值
要是使用未命名參數(shù),把代碼修改如下即可(注意數(shù)字索引從0開始):
stmt1.text="INSERT INTO emp (firstName, lastName, salary) VALUES (?, ?, ?)";
stmt1.parameters[0]="f";
stmt1.parameters[1]="l";
stmt1.parameters[2]=88;

?

4.刪除操作
private function del():void
{
?var stmt:SQLStatement = new SQLStatement();
?stmt.sqlConnection = con;
?stmt.text="delete from emp where salary=:salary";
?stmt.parameters[":salary"]=88;
?stmt.execute();
?
?var result:SQLResult = stmt.getResult();
??? var count:Number = result.rowsAffected;
???
??? Alert.show("成功刪除"+count.toString()+"行");
}
代碼說明:
rowsAffected屬性:指示受此操作影響的行數(shù)
請注意,當相關(guān)的 SQL 操作為不帶 WHERE 子句的 DELETE 語句時(即該語句刪除表中的所有行),rowsAffected 屬性始終為 0,而不管刪除了多少行。如果您需要知道刪除的行數(shù),則可以包括 WHERE 子句 WHERE 1 = 1,在這種情況下,將刪除所有行,并且 rowsAffected 屬性會精確反映已刪除的行數(shù)

?

5.修改操作
private function updateData():void
{
?var stmt:SQLStatement = new SQLStatement();
?stmt.sqlConnection = con;
?stmt.text="update emp set lastName=:lastName where salary=:salary";
?stmt.parameters[":lastName"]="la";
?stmt.parameters[":salary"]=88;
?stmt.execute();
?
?var result:SQLResult = stmt.getResult();
??? var count:Number = result.rowsAffected;
???
??? Alert.show("成功修改"+count.toString()+"行");
}
代碼說明:
把salary=88的lastName修改為"la"

?

6.代碼下載
http://files.cnblogs.com/aierong/Air_Test_SQLite2.rar

??

?

?

?

?

?

本章主要總結(jié)表的查詢

1.查詢
同步版本:
private function query():void
{
?var stmt:SQLStatement = new SQLStatement();
?stmt.sqlConnection = con;
??? ?stmt.text = "select empId,firstName,lastName,salary from emp";
?stmt.execute();?
?
?var result:SQLResult = stmt.getResult();
?
?if ( result.data!=null )
?{
??var numResults:int =result.data.length;
????
??for (var i:int = 0; i < numResults; i++)
??? ?{
??????? ?var row:Object = result.data[i];
??????? ?var output:String = "empId: " + row.empId;
??????? ?output += "; firstName: " + row.firstName;
??????? ?output += "; lastName: " + row.lastName;
??????? ?output += "; salary: " + row.salary;?
???????? ?
??????? ?Alert.show(output);?
???? }
??}
}
代碼說明:
getResult ()方法:執(zhí)行結(jié)果的SQLResult對象的訪問
SQLResult的data屬性:執(zhí)行語句而返回的數(shù)據(jù)。
如果某一語句不返回任何數(shù)據(jù),則此屬性為 null 。這就是本代碼需要判斷是否為空的目的。


2.
查詢部分結(jié)果
默認情況下,執(zhí)行 SELECT 語句會一次檢索結(jié)果集的所有行,有時我們需要查詢第 1 行怎么辦?
查詢第 1 行的異步版本實例代碼如下:
private var responder:Responder;
private var stmt:SQLStatement;
private function querytop1():void
{
?stmt = new SQLStatement();
?stmt.sqlConnection = con;
?stmt.text = "select empId,firstName,lastName,salary from emp where firstName=:firstName";
??? ?stmt.parameters[":firstName"]="f";
??? ?responder= new Responder(resultHandler, errorHandler);
?stmt.execute(1,responder);?
}

private function resultHandler(result:SQLResult):void
{
?if ( result.data!=null )
?{
??var numResults:int =result.data.length;
????
??for (var i:int = 0; i < numResults; i++)
??? ?{
??????? ?var row:Object = result.data[i];
??????? ?var output:String = "empId: " + row.empId;
??????? ?output += "; firstName: " + row.firstName;
??????? ?output += "; lastName: " + row.lastName;
??????? ?output += "; salary: " + row.salary;?
???????? ?
??????? ?Alert.show(output);?
???? }
??}
}

private function errorHandler(error:SQLError):void
{
?Alert.show(error.message);
?Alert.show(error.details);
}
代碼說明:
execute () 方法參數(shù)說明:
第1個參數(shù):此值指示該語句一次返回的行數(shù)。
默認值為 -1 ,指示一次返回所有結(jié)果行,
2 個參數(shù):一個 Responder 對象,指定操作成功或失敗時要調(diào)用的方法。
實際在本例中,也可以不用Responder對象,而用事件偵聽器執(zhí)行SQLStatement,以確定語句的執(zhí)行何時完成或失敗
stmt.addEventListener(SQLEvent.RESULT,resultHandler);
stmt.addEventListener(SQLErrorEvent.ERROR,errorHandler);
具體代碼實現(xiàn)可以參照以前的文章

?


3.代碼下載
http://files.cnblogs.com/aierong/Air_Test_SQLite3.rar

?

?

?

?

本章主要總結(jié)數(shù)據(jù)操作中的事務(wù)控制
由于SQLite中SQL語句不支持事務(wù),我們可以通過SQLConnection類的與事務(wù)相關(guān)的方法可使用此功能:SQLConnection.begin()、SQLConnection.commit() 和 SQLConnection.rollback()來實現(xiàn)事務(wù)功能。

關(guān)于air本地數(shù)據(jù)庫中的SQL支持可以參考
http://help.adobe.com/zh_CN/AIR/1.5/jslr/index.html?localDatabaseSQLSupport.html

事務(wù)實例代碼:
import mx.controls.Alert;
private var con:SQLConnection;

private function initApp():void
{
?var file:File = File.applicationStorageDirectory.resolvePath("myTestdb.db")
?con = new SQLConnection();
?var stmt:SQLStatement = new SQLStatement();
?
?? try
?? {
?? ?con.open(file);
?? ?
?? ?con.begin();
?? ?stmt.sqlConnection=con;
?? ?stmt.text="INSERT INTO emp (firstName, lastName, salary) VALUES ('f', 'l', 1110)";
??stmt.execute();
?? ?con.commit(); ?
?? }
?? catch(err:SQLError)
?? {
?? ?con.rollback();
?? ?Alert.show(err.message);
?? }
}?
代碼說明:
事務(wù)由begin方法開始,其間運行的n個sql語句要是成功,就由commit方法提交,其間要是有任何一個sql語句發(fā)生錯誤,就由rollback方法全部回滾.代碼比較簡單,有其他語言開發(fā)建議的人一眼就可以看明白。

?

代碼下載:
http://files.cnblogs.com/aierong/Air_Test_SQLite4.rar

?

?

?

A.Flex Air開發(fā)SQLite小結(jié)

1.sqlite各語句間用分號間隔

例如:select * from tablea;select * from tableb;

2. 關(guān)于 Flex 中用一個 SQLStatement 執(zhí)行多條 SQL 的代碼的問題

有些時候我們可能一次執(zhí)行多條 SQL ,不過比較遺憾的是一個 SQLStatement 只會執(zhí)行第一個 SQL

下面是一段簡單的代碼可以幫你解決這個問題,不過需要在 SQL 件用 ’;' 劃分:

try {
????? // Separate all statements
?????? var parts:Array = createSQL.split( ');' );
????? for( var i:int; i<parts.length; i++ ) {
???????? // Only, if we really have an SQL statement
???????? if ( '' != parts[i] ) {
???????????? createStmt.text = parts[i] + ');';
???????????? createStmt.execute();??
???????? }
????? }??
?? } catch( error:SQLError ) {
?????? // something failed...
?? }

具體文章可以

?

B.SQLite 開發(fā)工具

SQLite Spy

http://www.yunqa.de/delphi/sqlitespy

一個非常不錯的SQLite Database Explorer and Query Analyzer。不需要安裝。 強烈推薦這個,我自己也用 .

?

DBTools Manager

http://www.dbtools.com.br/

有免費版本的多數(shù)據(jù)庫管理器,同時支持SQLite

?

Aqua Data Studio

http://www.aquafold.com/

有很多功能支持很多數(shù)據(jù)庫的一個軟件,可以通過 JDBC ODBC 來支持 SQLite 查詢。

?

還有SQLite Administrator,后來發(fā)現(xiàn)Firefox的插件(addons) Sqlite Manager也是不錯的選擇。

?

C.SQLite與Sql Server的語法差異

1.返回最后插入的標識值
返回最后插入的標識值sql server用@@IDENTITY
sqlite用標量函數(shù)LAST_INSERT_ROWID()
返回通過當前的 SQLConnection 插入到數(shù)據(jù)庫的最后一行的行標識符(生成的主鍵)。此值與 SQLConnection.lastInsertRowID 屬性返回的值相同。

2.top n
在sql server中返回前2行可以這樣:
select top 2 * from aa
order by ids desc

sqlite中用LIMIT,語句如下:
select * from aa
order by ids desc
LIMIT 2

3.GETDATE ( )
在sql server中GETDATE ( )返回當前系統(tǒng)日期和時間
sqlite中沒有

4.EXISTS語句
sql server中判斷插入(不存在ids=5的就插入)
IF NOT EXISTS (select * from aa where ids=5)
BEGIN
insert into aa(nickname)
select 't'
END
在sqlite中可以這樣
insert into aa(nickname)
select 't'
where not exists(select * from aa where ids=5)

5. 嵌套事務(wù)
sqlite
僅允許單個活動的事務(wù)

6.RIGHT 和 FULL OUTER JOIN
sqlite不支持 RIGHT OUTER JOIN 或 FULL OUTER JOIN

7. 可更新的視圖
sqlite
視圖是只讀的。不能對視圖執(zhí)行 DELETE INSERT UPDATE 語句, sql server 是可以對視圖 DELETE INSERT UPDATE

?

最后推薦幾個好站點對開發(fā) sqlite 有幫助:

sqlite 官方站

http://www.sqlite.org/

?

SQL Syntax

http://www.sqlite.org/lang.html

?

sqlite中文站

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

http://www.sqlitechina.org/

?

Adobe AIR 包括創(chuàng)建和使用本地 SQL 數(shù)據(jù)庫的功能 ?

http://help.adobe.com/zh_CN/AIR/1.5/devappshtml/WS5b3ccc516d4fbf351e63e3d118676a5497-7fb4.html

?

Adobe AIR 語言參考本地數(shù)據(jù)庫中的 SQL 支持

http://help.adobe.com/zh_CN/AIR/1.5/jslr/index.html?localDatabaseSQLSupport.html

?

?

AIR 創(chuàng)建數(shù)據(jù)庫和表,以及同步和異步執(zhí)行模式


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 中文字幕专区在线亚洲 | 婷婷免费视频 | 中国xxx69免费| 精品亚洲一区二区三区在线播放 | 在线观看国产区 | 五月月色开心婷婷久久合 | 成人网在线观看 | 视频一区国产 | 国内第一永久免费福利视频 | 色偷偷7777www | 一区精品视频 | 一级毛片免费观看不卡的 | 香蕉久久网站 | 免费毛片一级 | 一级啪啪片 | 日韩精品一区二区在线观看 | 一级aa毛片 | xxx毛片| 久久免费高清视频 | 国产精品视频一区二区三区不卡 | 国产精品人成 | 欧美手机手机在线视频一区 | 国产精品国产福利国产秒拍 | 四虎精品成人免费影视 | 亚洲国产成人久久综合野外 | 欧美另类高清xxxxx | 夜夜操狠狠操 | 精品国产免费第一区二区三区日韩 | 精品煌色视频网站在线观看 | 欧美成人黄色网 | 国产欧美精品一区aⅴ影院 国产欧美精品一区二区 | 久久99精品久久久久久噜噜 | 四虎网址在线观看 | 一级毛片在线看在线播放 | 国产成人亚洲精品久久 | 牛牛影视ac精品视频 | 手机看片久久 | 日本手机在线视频 | 亚洲免费视频网址 | 色综合久久久久综合体桃花网 | 久久亚洲私人国产精品va |