日期:2014-05-16  浏览次数:20589 次

action的使用之封装AIR对本地数据库sqlite的操作
使用air开发除了可以使用xml和后台语言来存储提供数据外,还可以拥有自己的小型本地数据库sqlite,数据库的格式为db或db3。使用本地数据库的好处是轻量,可以存储复杂的数据关系,而且air提供有专门的api来访问它,这就不需要其它后台语言来支撑,air程序员就可以独立地完成项目了,熟悉其它大型数据库操作的开发人员可以方便地访问本地数据库(因为语法也大致相同)。在管理工具上,本地小型数据库有Sqlite Developer(推荐使用)、Sqlite Administrator、Sqlite Expert等。一般的flash程序员主要负责表现界面上,不怎么熟悉数据库的设计与操作。数据库结构设计是很重要的,如果一开始设计的数据库结构不合理,那么到后面的项目就难以开发维护了。 所以没有数据库开发经验的开发者要慎用本地数据库。
在我的air项目开发中,我使用了本地小型数据库来存储数据结构,并创建了一些类(SQLConnection和SQLiteAction)来封装数据库的操作,有了这些类之后,对数据库的操作和管理就方便多了。 关于这些类的使用,请看例子:http://sunnyluo.iteye.com/blog/800136

首先是SQLiteConnection类封装SQLConnection,主要负责打开、关闭数据库:
/**
 * 说明:SQLite数据库连接类。
 * 该类用于与数据库建立连接。
 * 外部可通过调用该类的connect()方法来建立与指定路径的数据库(文件)的连接.
 * 在调用connect与数据库建立连接时,如果成功建立(即成功打开数据库)会触发 SQLEvent.OPEN 事件
 * 如果打开失败,将触发 SQLErrorEvent.ERROR 事件;
 */
package sunnyluo.sqlite
{
	import flash.data.SQLConnection;
	import flash.data.SQLMode;
	import flash.events.EventDispatcher;
	import flash.events.SQLErrorEvent;
	import flash.events.SQLEvent;
	import flash.filesystem.File;
	import flash.filesystem.FileMode;
	import flash.filesystem.FileStream;
	
	[Event(name="open",type="flash.events.SQLEvent")]
	[Event(name="error",type="flash.events.SQLErrorEvent")]

	public class SQLiteConnection extends EventDispatcher
	{
		private var _conn : SQLConnection;
		private var _connected : Boolean = false;;
		private var _connecting:Boolean = false;
		private var _path : String;
		private var _dbFile:File;
		
		/**
		 * 构造函数. 
		 * 
		 */		
		public function SQLiteConnection(path : String)
		{
			_path = path;_conn = new SQLConnection();
				_connected = false;
		}
		
		/**
		 * 与指定路径的数据库文件建立连接.
		 * 
		 */		
		public function connect():void
		{
			if(!_conn)
			{
				_conn = new SQLConnection();
				_connected = false;
			}
			if(_connected){
				this.dispatchEvent(new SQLEvent(SQLEvent.OPEN));
				return;
			}
			if(_connecting)
			{
				return;
			} 
			_connecting = true;
			addHandler();     
			try{         
			//_dbFile?"":_dbFile=new File(_path).resolvePath(_path);
			_dbFile =new File(_path); 
			//如果数据库文件不存在,就先创建
			if(! _dbFile.exists)
			{
				var fs:FileStream = new FileStream();
				fs=new FileStream();
				fs.open(_dbFile,FileMode.APPEND);
				fs.close();
			}		
			_conn.openAsync(_dbFile, SQLMode.CREATE);
			}catch(e:Error)
			{
				trace(e.message, _path);
			}
			
		}
		
		/**
		 * 添加数据库连接事件侦听函数; 
		 * 
		 */		
		private function addHandler():void
		{
			if(_conn)
			{
				_conn.addEventListener(SQLEvent.OPEN, sqlOpenHandler);
				_conn.addEventListener(SQLErrorEvent.ERROR, openErrorHandler);
			}			
		}
		
		/**
		 * 移除数据库连接事件侦听函数;
		 * 
		 */		
		private function removeHandler():void
		{
			if(_conn)
			{
				_conn.removeEventListener(SQLEvent.OPEN, sqlOpenHandler);
				_conn.removeEventListener(SQLErrorEvent.ERROR, openErrorHandler);
			}
		}
		/**
		 * 成功打开数据库的事件处理函数;
		 * @param event
		 * 
		 */		
		private function sqlOpenHandler(event : SQLEvent):void
		{
			_connected = true;
			_connecting = false;
			removeHandler();
			this.dispatchEvent(event);
		}
		
		/**
		 * 打开数据库失败的事件处理函数. 
		 * @param event
		 * 
		 */		
		private function openErrorHandler(event : SQLErrorEvent):void
		{
			_connected = false;
			_connecting = false;
			removeHandler();
			this.dispatchEvent(event);
		}
		
		/**
		 * 是否已经建立了连接. 
		 * @return 
		 * 
		 */		
		public function isConnected() : Boolean
		{
			return _connected;
		}
		
		/**
		 * 获得 SQLConnection 对象
		 * @return 
		 * 
		 */		
		public function getConn():SQLConnection
		{
			return _conn ? _conn : new SQLConnection();
		}
		
		/**
		 *关闭数据库 
		 * 
		 */		
		public function close():void
		{
			if(_conn)
			{
				_conn.close();
				_conn=null;
			}	
			if(_dbFile){
				_dbFile.cancel();
				_dbFile=null;
			}
			_connected = false;
			_connecting = false;
		}
	}
}

然后是SQLiteAction类,它封装对数据库的操作,如创建表、插入、删除、更新等单一项的操作:
/** 
 * 说明:SQLite数据库操作类.
 * 该类是所有数据库操作的基类,如