0

使用 Flash Builder 4.6,我以http://www.flex-blog.com/adobe-air-sqlite-example (编辑:链接似乎已损坏)为例,并且有一部分代码没有工作:

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 对象,但它的数据为空。

从我之前的问题Adob​​e 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().data 变为空的可能原因是什么?

4

1 回答 1

3

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

您应该简单地创建一个新的 SQLStatement,或者至少为每个 Statement 执行创建离散的事件处理程序。更好的方法是使用Responder类,如下所示:

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

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

但是,如果您不介意始终保持与数据库的连接打开,则可以共享 SQLConnection。

于 2012-05-07T09:11:37.917 回答