使用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()。数据变为空的可能原因是什么?
答案 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。