日期:2014-05-16 浏览次数:20695 次
/**
 * 说明: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;
		}
	}
}/** 
 * 说明:SQLite数据库操作类.
 * 该类是所有数据库操作的基类,如