[AIR]连续使用SQLStatement查询的问题
[关于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().否则不能进行下一次查询

8月 31st, 2008 at 3:05 下午
博主,找不到您的联系方式,只好在这里留个消息,想找一位FLASH的高手,已留下邮箱,方便的话联系我,多谢。