我们特意将本应用程序设计得很简单。该应用程序在计算机的内存中创建一个数据库, 并在该数据库中创建一个表, 然后向数据库添加一些数据。单击 Load data (加载数据) 按钮, 然后检索数据, 并将其显示在屏幕上 (见图 1)。除了在单击按钮时加载数据以及在屏幕上显示这些数据之外, 不提供其它用户交互。特意这样做是为了使应用程序的重点完全放在数据库操作上。本范例应用程序演示 Adobe AIR 的以下功能:

图 1。通过本范例应用程序可以从数据库中加载数据。
注意: 本范例应用程序按原样提供, 用于教学目的。
若要充分利用本篇文章, 您需要以下软件和文件:
本范例应用程序包括以下文件:
应具备使用 Flex Builder 构建应用程序的一般经验。有关使用此快速入门指南的详细信息, 请参阅用 Flex 构建快速入门范例应用程序。
注意: 对于文件的 MXML 代码所使用的全部 Flex 组件, 本文将不一一介绍。有关详细信息, 请参阅《Flex 3 语言参考》*。
应用程序加载完毕时将调用 init() 方法。在此方法中创建 SQLConnection 实例名 conn。 (在方法外声明变量 conn, 以使该变量对应用程序中的所有代码都可用。) 此 SQLConnection 对象建立到数据库的连接, 并由其它对象用于对该特定数据库执行操作。创建 SQLConnection 实例后, 即调用 open() 方法, 以同步执行模式打开到数据库的连接。
try
{
conn.open(null);
}
catch (error:SQLError)
{
status = "Error opening database";
trace("error.message:", error.message);
trace("error.details:", error.details);
return;
}
createTable();
在本例中, 将 null 作为参数传递至 open() 方法, 表示运行时将在计算机的内存中而非在磁盘位置中创建数据库。此外, 还可以 (使用 File 实例) 指定文件位置。然后, 运行时将打开该位置的数据库文件 (如果文件不存在, 则首先创建该文件)。执行该任务的代码如下所示:
var dbFile:File = File.applicationStorageDirectory.resolvePath("DBSample.db");
conn.open(dbFile);
File.applicationStorageDirectory 指向 AIR 应用程序的存储目录, 该目录的定义对于每个 AIR 应用程序都是独一无二的。
由于 open() 的调用被包围在 try..catch 块中, 因此如果调用失败, 则 init() 方法返回, 执行结束。假定 open() 操作成功并且打开了数据库连接, 则调用 createTable() 方法, 在数据库中创建表。
createTable() 方法使用 SQLStatement 实例, 针对在 init() 方法中打开的数据库执行一条 SQL 命令。这条具体的 SQL 命令在数据库中创建一个名为“employees”的表, 其中包括四列。以下将代码分解, 分别介绍各段代码的作用:
创建名为 createStmt 的 SQLStatement 实例:
createStmt = new SQLStatement();
指定对通过 SQLConnection 实例 conn 连接的数据库执行语句:
createStmt.sqlConnection = conn;
定义用于创建数据库表的 SQL 语句文本。将表命名为“employees”。该表包含四列: “empId”、“firstName”、“lastName”和“salary”。
var sql:String = "";
sql += "CREATE TABLE IF NOT EXISTS employees (";
sql += " empId INTEGER PRIMARY KEY AUTOINCREMENT,";
sql += " firstName TEXT,";
sql += " lastName TEXT,";
sql += " salary NUMERIC CHECK (salary >= 0) DEFAULT 0";
sql += ")";
createStmt.text = sql;
执行语句 (被包围在 try..catch 块中, 用于确定是否出错):
createStmt.execute();
假定语句成功运行, 则创建“employees”表, 并调用 addData() 方法以执行过程中的下一步: 向新创建的表中添加数据。
与 createTable() 方法一样, addData() 方法也创建 SQLStatement, 在本例中是为了向数据库的“employees”表中插入一行数据。应用程序使用两个不同的 SQLStatement 实例 (insertStmt 和 insertStmt2) 插入两行数据:
insertStmt = new SQLStatement();
insertStmt.sqlConnection = conn;
var sql:String = "";
sql += "INSERT INTO employees (firstName, lastName, salary) ";
sql += "VALUES ('Bob', 'Smith', 8000)";
insertStmt.text = sql;
insertStmt2 = new SQLStatement();
insertStmt2.sqlConnection = conn;
var sql2:String = "";
sql2 += "INSERT INTO employees (firstName, lastName, salary) ";
sql2 += "VALUES ('John', 'Jones', 8200)";
insertStmt2.text = sql2;
try
{
insertStmt.execute();
insertStmt2.execute();
}
catch (error:SQLError)
{
status = "Error inserting data";
trace("INSERT error:", error);
trace("error.message:", error.message);
trace("error.details:", error.details);
return;
}
status = "Ready to load data";);
如果两条语句都已执行完毕且未出错, 则将状态栏文本 (status) 更新为“Ready to load data” (已准备好加载数据), 此时应用程序已准备好从数据库中检索数据以及在屏幕上显示这些数据。
与创建表并在其中插入数据一样, 从表中检索数据也是通过类似方法来实现的: 创建 SQLStatement 实例, 并将 SQL SELECT 语句作为 SQLStatement 实例的 text 属性。以下代码来自 getData() 方法, 这段代码创建并执行从“employees”表中检索所有行的 SELECT 语句:
selectStmt = new SQLStatement();
selectStmt.sqlConnection = conn;
var sql:String = "SELECT empId, firstName, lastName, salary FROM employees";
selectStmt.text = sql;
try
{
selectStmt.execute();
}
catch (error:SQLError)
{
status = "Error loading data";
trace("SELECT error:", error);
trace("error.message:", error.message);
trace("error.details:", error.details);
return;
}
当 SELECT 语句执行完毕后, 运行时继续从 getData() 方法开始执行以下代码。通过调用 SQLStatement 实例的 getResult() 方法, 访问由 SELECT 语句检索的结果数据。调用 getResult() 将返回存储在变量 result 中的 SQLResult 实例;实际的各行结果包含在该变量的 data 属性的一个数组中。通过将其 (即 result.data 属性) 设置为 resultsGrid 数据网格的 dataProvider 属性, 在名为 resultsGrid 的 Flex DataGrid 控件中显示这些结果:
status = "Data loaded"; var result:SQLResult = selectStmt.getResult(); resultsGrid.dataProvider = result.data;