I Love China

技术·人生

技术服务生活
繁體
8月 31st, 2008

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

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().否则不能进行下一次查询

8月 30th, 2008

[Flex]Tree与DataGrid绑定XML的不同之处

FlexFlex中Tree组件和DataGrid都可以直接绑定XML数据。Tree有labelField属性,而DataGridItem的是dataField,这不仅仅是名称上的差别,它们对XML格式的要求也不一样。比如

var testXML:XMLList =
<parts>
    <part label="t1" />
    <part label="t2" />
</parts>

我们可以将它绑定到Tree组件上,指定labelField为label,但是却无法将它绑定到DataGrid上,尽管指定dataField为label。只有下面的格式才行

<parts>
    <part>
      <label>t1</label>
    </part>
    <part>
      <label>t2></label>
     </part>
</parts>
7月 24th, 2008

[as3]Java和flash player 9.0.124.0的Socket链接

当使用java做后台,flash player版本为9.0.124.0或者player10的时候,使用socket链接都会出现意外的问题。
首先如果没有显示的使用loadPolicy加载到策略文件的话,flashplayer会先发送一个<policy-file-request/>请求。这是的做法是服务器要返回一个有效的xml策略文件。当使用Python及其他做后台时,不会有任何问题。flashplayer都能处理这个返回的策略文件,并新建一个sokcet链接,并不再发送policy-file-request请求。
但是,当使用java做后台时却不成功。
我用抓包工具抓取了两种情况下的数据包,发现python做后台时,在返回一个xml策略文件的随后,立马发送了一个数据结束的报文,而java没有。也就是说java做后台时,flashplayer并不知道策略文件发送完毕了。
解决的办法是我们在发送到策略文件后再加一个字符\0,这样就可以了。

7月 10th, 2008

vdoing邀请

本人现有10份vdoing的邀请,有需要的留下邮箱。
ps:是一个网站流量统计系统

5月 23rd, 2008

Flash ColorPicker的例子


这个例子中,可以选取整个SWF屏幕内的颜色,可以按Esc键关闭取色

4月 28th, 2008

[APMXE5]让APMXE5支持中文路径

在httpd.conf里加上AddType application/x-httpd-php .php
AddType image/x-icon .ico
然后把php5\php5ts.dll拷贝到apache\bin\目录下,重启服务器即可