本章主要總結(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
有免費版本的多數(shù)據(jù)庫管理器,同時支持SQLite
?
Aqua Data Studio
有很多功能支持很多數(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/lang.html
?
sqlite中文站
?
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
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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