我已经创建了一个从HTTPService检索XML输出并从它中填充数据库的简单方法,但是由于Flex的异步特性,函数在其仍在检索数据时进行,从而导致函数返回一个空值。请查找下面的代码;
视图:声明
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:dao="database.*"
preinitialize="open_databaseConnection();"
creationComplete="init();"
title="Indexes">
<fx:Declarations>
<dao:IndexesDAO id="srv"/>
</fx:Declarations>视图函数
private function open_databaseConnection() : void {
indexArrayCollection = new ArrayCollection;
indexArrayCollection = srv.listIndexes();
}database.IndexesDAO
package database {
import flash.data.SQLConnection;
import flash.data.SQLStatement;
import flash.events.Event;
import flash.filesystem.File;
import flash.filesystem.FileMode;
import flash.filesystem.FileStream;
import models.Index;
import mx.collections.ArrayCollection;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.rpc.http.mxml.HTTPService;
import mx.utils.ArrayUtil;
import mx.utils.ObjectProxy;
public class IndexesDAO {
private static var _sqlConnection:SQLConnection;
private var SubSonic:HTTPService = new HTTPService;
public function get sqlConnection() : SQLConnection {
if (_sqlConnection) return _sqlConnection;
var file:File = File.applicationStorageDirectory.resolvePath("db.db");
var fileExists:Boolean = file.exists;
_sqlConnection = new SQLConnection();
_sqlConnection.open(file);
if (!fileExists) {
createDatabase();
get_indexesXML(); //Calls populate database on result event.
}
return _sqlConnection;
}
protected function createDatabase() : void {
var sql:String =
"CREATE TABLE IF NOT EXISTS indexes ( "+
"id VARCHAR(200) PRIMARY KEY, " +
"name VARCHAR(200))";
var stmt:SQLStatement = new SQLStatement();
stmt.sqlConnection = sqlConnection;
stmt.text = sql;
stmt.execute();
}
protected function get_indexesXML() : void {
var requestString:String;
requestString = "/rest/index.xml";
var requestURL:String = Settings.ServerURL + requestString;
SubSonic.addEventListener(ResultEvent.RESULT, populateDatabase);
auth_send(requestURL);
}
private function auth_send(requestURL:String): void {
SubSonic.url = requestURL;
SubSonic.headers = {Authorization:"Basic " + Settings.EncryptedCreds()};
SubSonic.send();
}
protected function populateDatabase(evt:ResultEvent) : void {
var indexArrayCollection:ArrayCollection = new ArrayCollection();
var length:int;
var i:int;
length = (evt.result['server-response'].indexes.index.source.length);
for (i = 0; i < length; i++) {
var addArray:ArrayCollection;
if (evt.result['server-response'].indexes.index[i].artist is ArrayCollection) {
addArray = evt.result['subsonic-response'].indexes.index[i].artist;
} else if (evt.result['server-response'].indexes.index[i].artist is ObjectProxy) {
addArray = new ArrayCollection(ArrayUtil.toArray(evt.result['server-response'].indexes.index[i].artist));
}
indexArrayCollection.addAll(addArray);
}
var IndexesDAO:IndexesDAO = new IndexesDAO();
for each (var indexArr:Object in indexArrayCollection) {
var index:Index = new Index();
index.id = indexArr.id;
index.name = indexArr.name;
IndexesDAO.create(index);
}
}
public function create(index:Index) : void {
var sql:String = "INSERT INTO indexes (id, name) VALUES (?,?)";
var stmt:SQLStatement = new SQLStatement();
stmt.sqlConnection = sqlConnection;
stmt.text = sql;
stmt.parameters[0] = index.id;
stmt.parameters[1] = index.name;
stmt.execute();
}
public function listIndexes() : ArrayCollection {
var sql:String = "SELECT * FROM indexes ORDER BY name";
var stmt:SQLStatement = new SQLStatement();
stmt.sqlConnection = sqlConnection;
stmt.text = sql;
stmt.execute();
var result:Array = stmt.getResult().data;
if (result)
{
var list:ArrayCollection = new ArrayCollection();
for (var i:int=0; i<result.length; i++) {
list.addItem(result[i]);
}
return list;
}
else
{
return null;
}
}
public function refreshIndexes() : ArrayCollection {
var sql:String = "DROP TABLE indexes";
var stmt:SQLStatement = new SQLStatement();
stmt.sqlConnection = sqlConnection;
stmt.text = sql;
stmt.execute();
return listIndexes();
}
}
}如您所见,视图调用listIndexes();
但是,它可以在从HTTPService检索结果之前遍历数据库填充,从而生成一个空结果。有什么办法解决这个问题吗?
发布于 2011-08-06 07:33:53
您可能希望在populateDatabase结束时分派一个事件,并运行
indexArrayCollection = srv.listIndexes();事件侦听器中的一部分。然后,您可以确保结果已经加载。
private function open_databaseConnection() : void {
indexArrayCollection = new ArrayCollection;
srv.addEventListener(MyCustomEvent.DATA_LOADED, onDataLoaded);
}
private function onDataLoaded(evt:MyCustomEvent):void
{
indexArrayCollection = srv.listIndexes();
}https://stackoverflow.com/questions/6965131
复制相似问题