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