flex3.0新特性(1)----本地资源的操作,如加载PDF文件,对本地数据库的操作

Flex 3.0中最大的变化在于新增AIR工程。AIR应用程序是一种桌面应用程序。因为要支持对本地资源的操作,所以Flex 3.0中新增许多对本地资源的操作,如本地文件、PDF文件等。另外,AIR应用程序支持版本升级、集成网页、使用Ajax技术等。本章将介绍Flex 3.0这些新特性的具体应用。

23.1 加载PDF文件
在Flex 3.0中的AIR工程中新增HTMLControl类和HTMLPDFCapability类。通过这两个类可实现加载PDF文件,丰富了AIR应用程序的效果和功能。本小节将为读者介绍如何在AIR工程中加载PDF文件。

23.1.1 加载PDF文件前的准备
加载PDF文件需要有两个条件:第一是必须为AIR工程,第二是系统已安装Adobe Reader 8.1以上版本。前者是因为Flex 3.0中只有在AIR工程中可引用HTMLControl类和HTMLPDFCapability类。究其深层原因是Adobe公司只允许桌面应用程序(AIR)访问本地资源。其他Web工程出于安全性考虑,不可直接访问本地资源。

23.1.2 使用HTMLControl类加载PDF文件
HTMLControl类是AIR中新增的类,用于加载PDF。使用HTMLControl类加载PDF文件的语法如下所示。

HTMLControl变量.load(URLRequest变量);

以下代码使用HTMLControl类加载“123.pdf”文件。

var t:URLRequest=new URLRequest("123.pdf");

var hc:HTMLControl=new HTMLControl();

hc.load(t);

HTMLControl类中只有一个属性pdfCapability。此属性存储了PDF文件与Adobe Reader版本间的关系。在HTMLControl类的load方法执行后,自动得到版本信息。

23.1.3 使用HTMLPDFCapability类检测Adobe Reader版本
HTMLPDFCapability类定义了加载的PDF文件与Adobe Reader版本间的关系,使用状态字符串表示,如“ERROR_INSTALLED_READER_NOT_FOUND”。HTMLPDFCapability类的状态字符串如表23-1所示。

表23-1 HTMLPDFCapability类的状态字符串

状 态 名
说 明

HTMLPDFCapability.STATUS_OK
系统中已安装Adobe Reader 8.1以上版本

HTMLPDFCapability.ERROR_INSTALLED_READER_NOT_FOUND
系统中未安装Adobe Reader

HTMLPDFCapability.ERROR_INSTALLED_READER_TOO_OLD
系统中Adobe Reader版本太旧

HTMLPDFCapability.ERROR_PREFERRED_READER_TOO_OLD
当前有旧的Adobe Reader版本正在读取PDF


使用HTMLControl类的pdfCapability属性和HTMLPDFCapability类的状态字符串就能确定PDF文件与Adobe Reader版本间的关系。

以下代码表示系统中已安装Adobe Reader 8.1以上版本,可正常加载的PDF文件。

if(ht.pdfCapability==HTMLPDFCapability.STATUS_OK)

{

Alert.show("加载PDF正常");

}

23.1.4 加载PDF文件实例
加载PDF文件的步骤如下所示。

新建AIR工程。

确定系统中已安装Adobe Reader 8.1以上版本。

编写MXML文件。

MXML程序中主要处理是在初始化应用程序时加载PDF文件,并将结果添加到<mx:HTML>组件。以下代码加载PDF文件“1.pdf”并显示于<mx:HTML>组件上。

<?xml version="1.0" encoding="utf-8"?>

<mx:WindowedApplicationxmlns:mx="http://www.adobe.com/2006/mxml"layout="absolute"creationComplete="initApp()">

<mx:Script>

<![CDATA[

import flash.html.HTMLPDFCapability; //引用HTMLPDFCapability类

import flash.html.HTMLControl; //引用HTMLControl类

import mx.controls.Alert; //引用Alert类

//应用程序初始化函数

private function initApp():void

{

//Adobe Reader 8.1版本以上已安装时,加载pdf

if(HTMLControl.pdfCapability==HTMLPDFCapability.STATUS_OK)

{

var request:URLRequest = new URLRequest("1.pdf");//定义URLRequest实例

var pdf:HTMLControl = new HTMLControl(); //定义HTML

Control实例

pdf.height = 800; //设置pdf高度

pdf.width = 600; //设置pdf宽度

pdf.load(request); //加载pdf

container.addChild(pdf); //将pdf添加到HTML组件上

}

else

Alert.show("pdf不能显示,请安装Adobe Reader 8.1以上版本");

}

]]>

</mx:Script>

<mx:HTML id="container"/>

</mx:WindowedApplication>

(33) “if(HTMLControl.pdfCapability==HTMLPDFCapability.STATUS_OK)”语句用以判断系统中是否安装Adobe Reader 8.1以上版本。若未安装,则加载PDF文件不能完成。

(34) PDF文件只能显示于<mx:HTML>组件中。“container.addChild(pdf);”语句表示在<mx:HTML>组件中添加PDF文件数据。

按下Ctrl+F11键,编译运行程序。运行效果如图23-1所示。


图23-1 加载PDF文件效果

23.2 使用本地SQL数据库
SQL数据库是指可使用标准的SQL语句进行操作的数据库。本地SQL数据库是指操作系统支持的SQL数据库,如“.db”格式的数据库。AIR应用程序中新增了一些类(在“flash.data.*”包中),用以支持对本地SQL数据库的操作。对SQL数据库的基本操作包括Select(读取数据)、Insert(插入数据)、Update(修改数据)、Delete(删除数据)。本章将介绍对SQL数据库操作的基本语句及如何使用新增类操作数据库。

23.2.1 使用Select语句读取数据
Select语句用以读取表中的数据,其语法如下所示。

Select 列名1[as 别名1],列名2[as 别名2],…,列名n[as 别名n] from表名 where 条件

(35) 列名是指表中的列的名称。

(36) 用户可为列名取别名。此项默认与列名相同。

(37) 条件是指对数据的约束。例如,取表中考试成绩不及格的学生信息。

以下代码从学生成绩表“StudentScore”中读取不及格学生的学号、姓名、班级、成绩。

Select studentId as 学号,studentName as 姓名,studentClass as 班级,score as 成绩 from StudentScore where score<60

若读取表中的全部数据列,可使用“*”符。

若上述“StudentScore”表中只有学号、姓名、班级、成绩四列,读取数据的代码可如下所示。

Select * from StudentScore where score<60

23.2.2 使用Insert语句添加数据
Insert语句用以向表中添加数据,其语法如下所示。

Insert into 表名(列名1,列名2,...,列名n) values (数值1,数值2,…数值n)

(38) 列名必须是表中存在的列的名称。

(39) 数值顺序对应列名顺序,如数值1赋值给列名1。

以下代码向学生成绩表“StudentScore”中添加一条数据。

Insert into StudentScore(studentId,studentName,score) values (‘08’,’小明’,77)

对于字符串数据使用单引号封闭,数值不需要单引号封闭。

上述语法可选择性地添加列数据。例如,表中有四列,但只添加其中三列的数据。若对全部列添加数据可省略列名,其语法如下所示。

Insert into 表名 values (数值1,数值2,…数值n)

数值顺序必须严格遵循表中列的顺序。数值个数必须与列的个数相同。

以下代码向学生成绩表“StudentScore”中添加一条完整数据。

Insert into StudentScore values (‘08’,’小明’,’高三5班’,77)

23.2.3 使用Update语句修改数据
Update语句用以修改表中的数据,其语法如下所示。

Update 表名 set 列名1=修改值1,列名2=修改值2,…,列名n=修改值n where 条件

Update可修改表中的单条记录或多条记录。使用条件语句来控制修改范围。

以下代码使用Update语句将成绩59分修改为60分(及格)。

Update StudentScore set score=60 where score=59

需要注意的是,SQL语句中判断相等的操作符为“=”,而不是“==”。赋值语句使用Set子句或Select子句(Select语句的另外一种用法)。

若用户只想修改单条记录,可定义更加严格的条件。以下代码将小明同学的成绩59分提高到60分。

Update StudentScore set score=60 where score=59 and studentName=’小明’

23.2.4 使用Delete语句删除数据
Delete语句用以删除表中的数据,其语法如下所示。

Delete from表名 where 条件

Delete语句可删除单条记录或多条记录,方法是控制条件范围。以下代码使用Delete语句删除“高三5班”学生信息。

Delete from StudentScore where studentClass=’高三5班’

以下代码删除学号为“08”的学生信息。

Delete from StudentScore where studentId=’08’

23.2.5 使用SQLConnection类连接数据库
SQLConnection类用于连接数据库。对于要操作的数据库都应新建SQLConnection类实例。其语法如下所示。

var SQLConnection变量: SQLConnection=new SQLConnection();

以下代码定义了一个SQLConnection实例conn。

var conn:SQLConnection=new SQLConnection();

使用SQLConnection类的“open”方法打开数据库连接。其语法如下所示。

SQLConnection变量.open(File变量);

以下代码使用open方法打开本地SQL数据库“School.db”。

var conn:SQLConnection=new SQLConnection();

var dbFile:File =File.applicationResourceDirectory.resolve("School.db");

conn.open(dbFile);

(40) “File.applicationResourceDirectory”语句表示工程资源路径,即“bin”文件夹路径。

(41) resolve方法用以扩展文件路径,可看作是“\”符。

23.2.6 使用SQLStatement类执行SQL语句
SQLStatement类用于执行SQL语句,是操作SQL数据库的重要类。使用SQLStatement类的步骤如下。

定义SQLStatement类实例,其语法如下所示。

var SQLStatement变量:SQLStatement=new SQLStatement();

以下代码定义了一个SQLStatement类实例sqlcmd。

var sqlcmd:SQLStatement=new SQLStatement();

指向其使用的数据库。SQLStatement实例必须指明应用的数据库,即指向SQLConnection实例。SQLStatement实例指向数据库的语法如下所示。

SQLStatement变量.sqlConnection=SQLConnection变量;

sqlConnection属性类型为SQLConnection,表示指向的数据库实例。以下代码中SQLStatement实例stmt指向数据库实例conn。

var conn:SQLConnection=new Connection();

var dbFile:File = File.applicationResourceDirectory.resolve("School.db");

conn.open(dbFile);

var stmt:SQLStatement=new SQLStatement();

stmt.sqlConnection=conn;

为SQLStatement实例定义SQL语句。其语法如下所示。

SQLStatement变量.text="SQL语句";

text属性类型为String,用于定义SQL语句。以下代码为SQLStatement实例stmt定义SQL语句“select * from table”。

var stmt:SQLStatement=new SQLStatement();

stmt.text="select * from table";

执行SQLStatement实例。执行SQLStatement实例的结果是执行SQL语句。使用SQLStatement类的excute方法开始执行SQL语句。其语法如下所示。

SQLStatement变量.excute();

以下代码使用excute方法开始执行SQL语句“select * from table”。

var stmt:SQLStatement=new SQLStatement();

stmt.text="select * from table";

stmt.excute();

为SQLStatement实例添加监听。执行SQLStatement实例后的状态有很多,常用的是正常返回结果和运行异常两种。需要对两个状态都添加监听。为SQLStatement实例添加监听的语法如下所示。

SQLStatement变量.addEventListener(监听状态,处理函数);

以下代码为“SQLEvent.RESULT”(正常返回结果)和“SQLErrorEvent.ERROR”(运行异常)状态添加监听。

stmt.addEventListener(SQLEvent.RESULT,showDataResult);

stmt.addEventListener(SQLErrorEvent.ERROR, errorHandle);

(42) SQLEvent.RESULT状态表示SQLStatement实例执行成功并返回结果。

(43) SQLErrorEvent.ERROR状态表示SQLStatement实例执行异常。

获取返回数据集。执行有返回数据的SQL语句,数据集存储于SQLStatement实例中。使用SQLStatement类的getResult方法可得到数据集。其语法如下所示。

SQLStatement变量.getResult().data;

以下代码使用getResult方法获得SQL语句“select * from table”的执行结果。

var stmt:SQLStatement=new SQLStatement();

stmt.text="select * from table";

stmt.excute(); //执行SQL语句

stmt.addEventListener(SQLEvent.RESULT,showDataResult);



function showDataResult(e:SQLEvent):void

{

var t:Array=stmt.getResult().data as Array; //获得结果集

}

23.2.7 操作本地SQL数据库实例
本小节以实例为读者讲解如何使用SQL语句操作数据库,其步骤如下所示。

设计数据库“School”。“School”数据库中只有一张表“Notes”,用以存储通知信息。“Notes”表的列设计如表23-2所示。

表23-2 “Notes”表的设计说明

列 名
类 型
说 明
是否为主码

noteId
integer
通知id


title
text
标题


content
text
内容


publisher
text
发布者



以下代码是创建表的SQL语句。

CREATE TABLE IF NOT EXISTS Notes

(

noteId INTEGER PRIMARY KEY AUTOINCREMENT,

title TEXT,

content TEXT,

publisher TEXT,

)

(44) 此SQL语句在应用程序中定义并执行。

(45) “IF NOT EXISTS Notes”语句表示创建表“Notes”前先判断是否已存在此表。若已存在“Notes”表,不执行此创建语句。

(46) “noteId INTEGER PRIMARY KEY AUTOINCREMENT”表示“noteId”列为interger型(整型)、主码、新增记录时自动增1。

新建AIR工程。

设计应用程序的外观模型。

此实例包括一个DataGrid组件,用以绑定数据。一些输入框及按钮,为数据插入数据库作准备。以下代码是外观模型生成的MXML代码。

<mx:Panel >

<mx:DataGrid id="dg" verticalScrollPolicy="auto">

<mx:columns>

<mx:DataGridColumn headerText="编号" dataField="noteId"/>

<mx:DataGridColumn headerText="标题" dataField="title"/>

<mx:DataGridColumn headerText="内容" dataField="content"/>

<mx:DataGridColumn headerText="发布者" dataField="publisher"/>

</mx:columns>

</mx:DataGrid>

<mx:Canvas height="259" width="401">

<mx:Label text="标题" x="10" y="12"/>

<mx:TextInput x="69" y="10" width="296" id="txtTitle"/>

<mx:Label text="内容" x="10" y="51"/>

<mx:TextArea x="69" y="50" width="296" height="110" id="txtContent"/>

<mx:Label text="发布者" x="10" y="171"/>

<mx:TextInput width="92" id="txtPublisher" x="69" y="169"/>

<mx:Button label="确定" id="btnOk" click="insertDataHandle();" x="69" y="218"/>

</mx:Canvas>

</mx:Panel>

设计模式下的外观模型效果如图23-2所示。


图23-2 操作SQL数据库实例的外观效果

连接“School”数据库。本实例中在工程“bin”文件夹下创建“School.db”数据库,并使用SQLConnection类连接数据库。以下代码创建“School.db”数据库,并使用SQLConnection类连接。

private var conn:SQLConnection = new SQLConnection(); //定义SQLConnection实例

private var dbFile:File = File.applicationResourceDirectory.resolve ("School.db"); //定义数据库文件路径



conn.open(dbFile); //打开数据库文件

File类中的resolve方法用以定位文件。若指定路径下的文件不存在将自动创建。

创建“Notes”表。在连接数据库“School.db”后,创建“Notes”表。方法是使用SQL语句创建。以下代码使用SQLStatement类执行SQL语句,从而创建“Notes”表。

private var createStmt:SQLStatement=new SQLStatement();//定义SQLStatement实例

//数据库文件打开后的处理函数

private function openHandler(e:SQLEvent):void

{

createStmt.sqlConnection = conn; //定义语句连接的数据库

//sql语句创建表Notes

var sql:String ="CREATE TABLE IF NOT EXISTS Notes ("

+"noteId INTEGER PRIMARY KEY AUTOINCREMENT,"

+"title TEXT,"

+"content TEXT,"

+"publisher TEXT"

+")";

createStmt.text = sql;

createStmt.execute(); //执行sql语句

}

获得数据集并显示于DataGrid组件中。在执行完创建表的SQL语句后,使用Select语句获取“Notes”表中的全部数据,并绑定至DataGrid组件上。以下代码使用SQLStatement实例createStmt执行Select语句,从而获得“Notes”表中的数据,并显示于DataGrid组件。

//创建完表或已存在表时显示表中的数据

private function createTableResult(e:SQLEvent):void

{

createStmt.sqlConnection = conn; //定义语句连接的数据库

createStmt.text ="select * from Notes";

//添加对SQLEvent.RESULT状态的监听

createStmt.addEventListener(SQLEvent.RESULT,showDataResult);

createStmt.execute(); //执行sql语句

}

//显示数据处理函数

private function showDataResult(event:SQLEvent):void

{

dg.dataProvider=createStmt.getResult().data; //绑定数据集

}

向数据库中插入数据。当单击“确定”按钮时,使用Insert语句将数据插入到数据库中。以下代码使用SQLStatement实例stmt执行Insert语句,从而向“Notes”表中插入新数据。

//插入数据处理函数

private function insertDataHandle():void

{

var stmt:SQLStatement=new SQLStatement();

stmt.sqlConnection = conn; //定义语句连接的数据库

stmt.text ="insert into Notes(title,content,publisher) values('"

+txtTitle.text+"','"

+txtContent.text+"','"

+txtPublisher.text+"')";

stmt.execute(); //执行sql语句

}

完成剩余代码。应用程序剩余的代码包括初始化函数initApp、运行异常处理函数errorHandle、引用不同类等。

以下是应用程序的完整代码。

<?xml version="1.0" encoding="utf-8"?>

<mx:WindowedApplication width="600"

fontSize="13" height="500"

xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete ="initApp()">

<mx:Script>

<![CDATA[

import flash.data.SQLConnection; //引用SQLConnection类

import flash.data.SQLStatement; //引用SQLStatement类

import flash.events.SQLErrorEvent; //引用SQLErrorEvent类

import flash.events.SQLEvent; //引用SQLEvent类

import flash.filesystem.File; //引用File类

import mx.controls.Alert; //引用Alert类

private var conn:SQLConnection = new SQLConnection(); //定义SQLConnection实例

private var createStmt:SQLStatement=new SQLStatement(); //定义SQLStatement实例

//定义数据库文件路径

private var dbFile:File = File.applicationResourceDirectory. resolve("School.db");

//应用程序初始化处理函数

public function initApp():void

{

conn.addEventListener(SQLEvent.OPEN, openHandler); //监听SQLEvent.OPEN状态

//监听SQLErrorEvent.ERROR状态

conn.addEventListener(SQLErrorEvent.ERROR, errorHandle);

conn.open(dbFile); //打开数据库文件

}

//数据库文件打开后的处理函数

private function openHandler(e:SQLEvent):void

{

createStmt.sqlConnection = conn; //定义语句连接的数据库

//sql语句创建表Notes

var sql:String ="CREATE TABLE IF NOT EXISTS Notes ("

+ "noteId INTEGER PRIMARY KEY AUTOINCREMENT,"

+ "title TEXT,"

+ "content TEXT,"

+ "publisher TEXT"

+ ")";

createStmt.text = sql;

//添加对SQLEvent.RESULT状态的监听

createStmt.addEventListener(SQLEvent.RESULT,createTableResult);

//监听SQLErrorEvent.ERROR状态

createStmt.addEventListener(SQLErrorEvent.ERROR, errorHandle);

createStmt.execute(); //执行sql语句

}

//创建完表或已存在表时显示表中的数据

private function createTableResult(e:SQLEvent):void

{

createStmt.sqlConnection = conn; //定义语句连接的数据库

createStmt.text ="select * from Notes";

//添加对SQLEvent.RESULT状态的监听

createStmt.addEventListener(SQLEvent.RESULT,showDataResult);

//监听SQLErrorEvent.ERROR状态

createStmt.addEventListener(SQLErrorEvent.ERROR, errorHandle);

createStmt.execute(); //执行sql语句

}

//显示数据处理函数

private function showDataResult(event:SQLEvent):void

{

dg.dataProvider=createStmt.getResult().data; //绑定数据集

}

//插入数据处理函数

private function insertDataHandle():void

{

var stmt:SQLStatement=new SQLStatement();

stmt.sqlConnection = conn; //定义语句连接的数据库

stmt.text ="insert into Notes(title,content,publisher) values('"

+txtTitle.text+"','"

+txtContent.text+"','"

+txtPublisher.text+"')";

//添加对SQLEvent.RESULT状态的监听

createStmt.addEventListener(SQLEvent.RESULT,showDataResult);

//监听SQLErrorEvent.ERROR状态

stmt.addEventListener(SQLErrorEvent.ERROR, errorHandle);

stmt.execute(); //执行sql语句

}

//对数据库操作出错时的处理函数

private function errorHandle(event:SQLErrorEvent):void

{

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

}

]]>

</mx:Script>

<mx:Panel >

<!--DataGrid组件,用以显示数据-->

<mx:DataGrid id="dg" verticalScrollPolicy="auto">

<mx:columns>

<mx:DataGridColumn headerText="编号" dataField="noteId"/>

<mx:DataGridColumn headerText="标题" dataField="title"/>

<mx:DataGridColumn headerText="内容" dataField="content"/>

<mx:DataGridColumn headerText="发布者" dataField="publisher"/>

</mx:columns>

</mx:DataGrid>

<mx:Canvas height="259" width="401">

<mx:Label text="标题" x="10" y="12"/>

<mx:TextInput x="69" y="10" width="296" id="txtTitle"/> <!--“标题”输入框-->

<mx:Label text="内容" x="10" y="51"/>

<!--“内容”输入框-->

<mx:TextArea x="69" y="50" width="296" height="110" id="txtContent"/>

<mx:Label text="发布者" x="10" y="171"/>

<mx:TextInput width="92" id="txtPublisher" x="69" y="169"/> <!--"发布者"输入框-->

<!--按钮组件,用以添加数据-->

<mx:Button label="确定" id="btnOk" click="insertDataHandle();" x="69" y="218"/>

</mx:Canvas>

</mx:Panel>

</mx:WindowedApplication>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值