2012-05-07 65 views
0

使用Flash Builder 4.6,我下面 http://www.flex-blog.com/adobe-air-sqlite-example (编辑:链接似乎被打破)作为一个例子,有代码的一部分不工作:Adob​​e Air:为什么SQLStatement的getResult()。data为null?

private function resault(e:SQLEvent):void 
{ 
    // with sqls.getResault().data we get the array of objects for each row out of our database 
    var data:Array = sqls.getResult().data; 
    // we pass the array of objects to our data provider to fill the datagrid 
    dp = new ArrayCollection(data); 
} 

检查程序在运行时给了我,sqls.getResult()返回一个有效的SQLResult对象,但它的数据为空。

而从我以前的问题Adobe Air: convert sqlite's result [object Object] to String?,似乎我问的是错误的问题。

不过,我检查了我的SQLResult对象与

trace(ObjectUtil.toString(sqls.getResult())); 

,我可以看到,我得到了所有从我的SQLite内容:

(flash.data::SQLResult)#0 
    complete = true 
    data = (Array)#1 
    [0] (Object)#2 
     first_name = "AAA" 
     id = 1 
     last_name = "BBB" 
    [1] (Object)#3 
     first_name = "AAA" 
     id = 2 
     last_name = "BBB" 
    [2] (Object)#4 
     first_name = "qqq" 
     id = 3 
     last_name = "qqq" 
    lastInsertRowID = 0 
    rowsAffected = 0 

所以这是怎么回事呢?我是否真的必须创建自己的函数来解析所有的sqlite元素,然后将它们放入数据提供程序中?是的,我能做到这一点,但严重的是,很多教程显示使用:

var data:Array = sqls.getResult().data; 
dp = new ArrayCollection(data); 

现在,回到了一个问题:什么可能是sqls.getResult的可能原因()数据成为空?

回答

3

这看起来并不像你在那里遵循的一个非常好的教程(在我看来)。在该代码中,您有一个正在执行的所有语句的事件侦听器。它甚至只有一个执行不同查询的SQLStatement。我不知道你的代码究竟出了什么问题,但我相当确定原因是在那里找到的。 (甚至不要让我开始说这个Timer在执行语句时作为延迟使用,Yuck!)。我强烈建议你寻找更好的Flex/AIR/SQLite学习资源。

您应该简单地创建一个新的SQLStatement,或至少对每个语句执行离散事件处理程序。一个更好的办法来做到这一点,将是使用Responder类,像这样:

var stmt:SQLStatement = new SQLStatement(); 
stmt.sqlConnection = connection; 
stmt.text = query; 

var token:Responder = new Responder(onResult, onFail); 
stmt.execute(-1, token); 

的SQLConnection可以共享的,虽然,如果你不介意保持到数据库的连接打开所有的时间。

+1

我现在可以看到,从教程,之所以说的getResult()。数据为空是因为在db_opened功能,我们执行SQLite的查询,如果它不存在,这将创建一个表。有从查询返回什么,因此我们得到从那里空。因此,我会根据你的建议去做。谢谢。 – Karl