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

action的使用之AIR操作本地数据库sqlite的示例

使用封装好的SQLiteAction类能很方便地实现本地数据库操作,甚至不需要熟悉本地数据库操作的API,有关SQLiteAction的内容可以参考http://sunnyluo.iteye.com/blog/800106。以下简单示例是关于使用SQLiteAction类来操作本地数据库sqlite的:


首先创建一个本地数据库“resource/db/sys.db”,并创建一个用户表T_User,字段有用户ID(C_UserID )和用户名(C_UserName),可以插入或删除一条数据。下面就分析一下主要的功能类。
先创建数据库操作服务类:SysdbService.as,所有对于sys.db数据库的操作都封装在这个类里面:

/**
*系统数据库操作服务类 
*/
package examples.sqlite.service
{
	import flash.filesystem.File;
	
	import sunnyluo.action.IAction;
	import sunnyluo.sqlite.SQLiteAction;
	import sunnyluo.sqlite.SQLiteConnection;
	
	public class SysDbService
	{
		//系统数据库路径
		public static const SYS_DB_PATH:String = File.applicationDirectory.nativePath + "/resource/db/sys.db"
		public static var sysDbConn:SQLiteConnection = new SQLiteConnection(SYS_DB_PATH);
		
		public function SysDbService()
		{
		}
		
		//创建用户数据表
		public static function createUserTable():IAction
		{
			var sql:String =
					"CREATE TABLE IF NOT EXISTS T_User (" +
					"C_UserID TEXT, "+
  					"C_UserName TEXT)";	
			return getAction(sql);
		}
		
		//插入一条数据到用户表里
		public static function insertUser(userId_:String, userName_:String):IAction
		{
			var sql :String = "INSERT INTO T_User(C_UserID,C_UserName) VALUES('" + 
					userId_+"','"+userName_+"')";
			return getAction(sql);
		}
		
		//删除用户表里的一条数据
		public static function deleteUser(userId_:String):IAction
		{
			var sql : String = "DELETE FROM T_User WHERE C_UserID= '"+userId_+"'";	
			return getAction(sql);
		}
		
		//更新用户表里的一条数据
		public static function updateUser(userId_:String, userName_:String):IAction
		{
			var sql:String = "UPDATE T_User SET" + 
							 " C_UserID = '"+userId_+"',"+
							 " C_UserName = '"+userName_+"'"+
							 " WHERE C_UserID  = '"+ userId_+"'";
			return getAction(sql);
		}
		
		//获取用户表里的所有数据
		public static function getAllUsers():IAction
		{
			var sql : String = "SELECT * FROM T_User";
			return getAction(sql);
		}
		
		//获取数据库动作
		private static function getAction(sql_ : String):IAction
		{
			var __action:IAction = new SQLiteAction(sysDbConn, sql_);			
			return __action;
		}

	}
}



调用服务类SysdbService里的静态方法,如创建用户表并侦听完成事件,只需这样:

//创建用户表
		private function createTable():void
		{
			var __action:IAction = SysDbService.createUserTable();
			ActionUtil.addActionHandler(__action, onTableComplete, onTableError);
			__action.execute();
			
			function onTableComplete(event:ActionEvent):void
			{
				//getData(); //执行其他操作
			}
			
			function onTableError(event:ActionEvent):void
			{
				Alert.show("无法创建用户表!");
			}
		}



如果要获取数据表里的数据,一般都会创建一个action类来封装获取数据的逻辑,并使用VO来存储单条数据,最后返回数组。在例子中,我创建了GetUsersAction类来封装获取所有用户数据的逻辑,并用UserVO来存储用户数据,最后返回了存有所有用户数据的数组:

/**
*获取所有用户数据 
*/
package examples.sqlite.action
{
	import examples.sqlite.service.SysDbService;
	import examples.sqlite.vo.UserVO;
	
	import sunnyluo.action.Action;
	import sunnyluo.action.ActionEvent;
	import sunnyluo.action.ActionUtil;
	import sunnyluo.action.IAction;

	public class GetUsersAction extends Action
	{
		public function GetUsersAction(name_:String="")
		{
			super(name_);
		}
		
		override public function execute(event:ActionEvent = null):void
		{
			getUsers();
		}
		
		private function getUsers():void
		{
			var __action:IAction = SysDbService.getAllUsers();
			ActionUtil.addActionHandler(__action, onComplete, onError);
			__action.execute();
		}
		
		//获取用户数据成功
		private function onComplete(event:ActionEvent):void
		{
			var __result:Array = [];
			var __userVO:UserVO;  
			var __arr:Array = event.data as Array;
			var __len:int = __arr ? __arr.length : 0;
			for (var i:int=0; i < __len; i++)
			{
				__userVO=new UserVO();
				__userVO.userID=__arr[i].C_UserID;
				__userVO.userName=__arr[i].C_UserName;
				__result.push(__userVO);
			}
			
			this.actionCompleteHandler(__result);	//返回所有用户数据
		}
		
		//获取用户数据失败
		private function onError():void