Adobe Air:为什么SQLStatement的getResult()。data为null?

时间:2012-05-07 05:12:45

标签: flash flex sqlite air flash-builder

使用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对象,但其数据为null。

从我之前的问题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()。数据变为空的可能原因是什么?

1 个答案:

答案 0 :(得分:3)

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

您应该为每个Statement执行创建一个新的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。