I Love China

技术·人生

技术服务生活
繁體

Archive for the ‘AIR’ Category

[AIR]获取命令行参数

星期日, 12月 14th, 2008

用AIR开发的应用程序可以从命令行启动,比如在Windows下可以在命令提示符下键入应用程序名字来启动它,同时还可以传递一个或多个参数。当我们开发的AIR程序关联了某种类型的文件后,就更有用了,比如当用户双击了已经关联到我们的程序的某个文件时,系统会打开我们的程序,并把改文件的完整路径传递进来,那么我们的程序如何获得传递进来的这个参数呢?
就是使用nativeApplication来监听InvokeEvent.INVOKE,然后通过该事件的arguments属性读取传递进来的参数。

[AIR]AIR做的一个视频播放器

星期六, 12月 13th, 2008

用AIR作了一个视频播放器

可以打开一个或多个本地视频文件,也可以打开网上的视频文件。

2008-12-14 更新
实现最小化窗口和播放窗口比例设置

点此下载mediaplayer

[AIR]连续使用SQLStatement查询的问题

星期日, 8月 31st, 2008

AIR[关于AIR-SQLITE的问题]
[问题描述]
使用SQLStatement的实例stmt查询数据库,并在结果事件处理函数中再次使用stmt查询时,上次查询的结果会累计到下次查询中。比如考虑下面的例子:

private function initList():void
{
	stmt.addEventListener(SQLEvent.RESULT,getCategory);
	stmt.addEventListener(SQLErrorEvent.ERROR,getCategoryErr);
	stmt.text = "select category from foods group by category";
	stmt.execute();
}
private function getCategoryErr(e:SQLErrorEvent):void
{
	trace("err");
}
private function getCategory(e:SQLEvent):void
{

	var str:String = "";
	stmt.removeEventListener(SQLEvent.RESULT,getCategory);
	var result:SQLResult = stmt.getResult();
	var len:uint = result.data.length;
	//trace(len);
	for(var i:uint = 0; i < len; i++)
	{
		str += "";
	}
	str +="";
	//trace(str);
	categoryXML = new XML(str);
	categoryTree.labelField = "@label";
	categoryTree.dataProvider = categoryXML;
	categoryTree.showRoot = false;
	categoryTree.selectedIndex = 0;
	initFood(categoryXML.child(0).@label);
}
private function initFood(str:String):void
{
	//trace(str);

	stmt.addEventListener(SQLEvent.RESULT,getFood);
	stmt.text = "select foodName from foods where category='" + str + "'";
	stmt.execute();
}
private function getFood(e:SQLEvent):void
{
	var str:String = "";
	stmt.removeEventListener(SQLEvent.RESULT,getFood);
	var result:SQLResult = stmt.getResult();
	var len:uint = result.data.length;
	for(var i:uint = 0; i < len; i++)
	{
		str += "";
	}
	str +="";
	//trace(str);
	foodXML = new XML(str);
	foodTree.labelField = "@label";
	foodTree.dataProvider = foodXML;
	foodTree.showRoot = false;

}

其中方法initList将开始一个SQLStatement查询,并使用getCategory处理查询结果,在getCategory中,首先注销了事件监听,并使用getResult取出序列中的查询结果,然后使用结果构建了一个XML对象,作为Tree组件的dataProvider,紧接着又通过调用initFood,开始了一个新的查询,并使用getFood处理查询结果,并将结果构造成foodXML的内容,问题出现了,上次查询,也就是getCategory中的结果一直保留着,出现在了getFood查询的结果中。如果不在getCategory里直接调用initFood,而是过一段时间后再调用initFood,则不会出现这样的问题。
[简单分析]
Flex帮助文档中说,SQLStatement的查询的结果一直保存在序列中,直到调用一次getResult,才会清除一次。但是上面描述的问题中,尽管我调用了getResult,但是结果依然没有被清理掉。看来它的清理也是需要一段时间才执行的。
[解决办法]
可以使用Timer,过一段时间后再执行,或者重构stmt,即在getCategory方法体内调用initFood前,加上
stmt = new SQLStatement();
stmt.sqlConnection = conn;

另外还有一个问题,就是关于分页的问题,SQLite似乎不支持类似 select top(10) …这样的查询,如果要取前几条数据,可以这样stmt.execute(10),这样就是取前10条数据,但是,如果10条之后的数据,你不想用的话别忘了在getResult后调用stmt.cancel().否则不能进行下一次查询