【问题标题】:How do I assign SQL results to variables or into an array in ActionScript 3?如何将 SQL 结果分配给 ActionScript 3 中的变量或数组?
【发布时间】:2016-02-02 18:48:53
【问题描述】:

我正在构建一个 Flash AIR 应用程序,它将作为一个信息亭安装,用于接受访问者 cmets,然后显示以前访问者的 cmets。这需要高度图形化,因此将查询/SQL 结果返回到数据网格不是合适的最终结果。该数据库只是由 Flash 应用程序创建的本地数据库,因为这是一个非网络信息亭安装。

我见过很多 cmets 谈论数据网格,我也见过将所有查询结果显示为单个字符串的代码 - 但我希望填充(不点击数据网格)一系列动态包含我的查询结果的文本字段。

Insert 语句运行良好:

function addData(): void
{
insertStmt = new SQLStatement();
insertStmt.sqlConnection = conn;
var sqlAdd: String = "";
sqlAdd += "INSERT INTO comments (firstName, lastName, homeTown, comment, avatarID, tagID) ";
sqlAdd += "VALUES ('" + inputFirstName + "', ";
sqlAdd += "'" + inputLastName + "', ";
sqlAdd += "'" + inputHomeTown + "', ";
sqlAdd += "'" + inputComment + "', ";
sqlAdd += inputAvatarID + ", ";
sqlAdd += inputTagID;
sqlAdd += ")";

insertStmt.text = sqlAdd;

insertStmt.addEventListener(SQLEvent.RESULT, insertResult);
insertStmt.addEventListener(SQLErrorEvent.ERROR, insertError);

insertStmt.execute();
}

当我点击一个按钮时,我还可以让我的 Select 语句起作用:

function getData(event: MouseEvent): void
{
selectStmt = new SQLStatement();
selectStmt.sqlConnection = conn;
var sql: String = "SELECT firstName, lastName, comment FROM comments";
selectStmt.text = sql;

selectStmt.addEventListener(SQLEvent.RESULT, selectResult);
selectStmt.addEventListener(SQLEvent.RESULT, traceResult);
selectStmt.addEventListener(SQLErrorEvent.ERROR, selectError);

selectStmt.execute();
}

我完全卡住的地方是提取这些信息,或者给每个东西一个变量名以便我以后可以使用它,或者至少将数据放入一个多维数组中,这样我就可以使用类似的语法来引用数据

array[1][firstName]

这是我得到的代码不能正常工作:

function selectResult(event: SQLEvent): void
{
selectStmt.removeEventListener(SQLEvent.RESULT, selectResult);
selectStmt.removeEventListener(SQLErrorEvent.ERROR, selectError);

var result: SQLResult = selectStmt.getResult();

// The results grid works so I know I'm getting the data back
resultsGrid.dataProvider = new DataProvider(result.data);

var resultsArray01: Array;
var newResultsRow: Array;

if (result != null)
{
    // Iterate through each entry
    for each(var entry: Object in result.data)
    {
        // Trace entry  -- this works when I test it
        trace(entry.firstName,entry.comment, entry.homeTown);

        // Add entries to array -- where I get into troubles
        // I get TypeError: Error #1009: Cannot access a property or method of a null object reference.
        newResultsRow.push(entry.firstName, entry.comment, entry.homeTown);
        resultsArray01.push(newResultsRow);
    }

}
}

对不起,如果这是冗长的。我对 AS3 很陌生,但对 SQL 还算不错。任何帮助表示赞赏。

【问题讨论】:

  • 你声明了你的数组,但你没有实例化它们! var resultsArray01: Array = []; var newResultsRow: Array = [];
  • 谢谢你,@Karmacon!这确实有很大帮助。我使用了`var resultsArray01: Array = new Array(); var newResultsRow: Array = new Array();` 接下来我需要弄清楚的是如何让循环正常工作,以便为每个循环提供 resultsArray01 和新行。 newResultsRow 正在接受条目,但我不确定 resultsArray01 我会调查嵌套循环吗?

标签: sqlite actionscript-3 flash datagrid


【解决方案1】:

您不需要多维数组。你甚至不需要创建一个循环。您可以按原样存储结果。

//Declare variable to store the data
var resultsArray:Array;

var result: SQLResult = selectStmt.getResult();
if (result != null)
{
    resultsArray = result.data;
}

那么你就可以这样做了……

trace(resultsArray[1]["firstName"]);

虽然使用点语法更好

trace(resultsArray[1].firstName);

【讨论】:

  • 这很好用。我不确定我是笨还是没有足够的文档,或者两者兼而有之。谢谢你。我只是好奇为什么使用点符号而不是方括号更好。
  • 一点都不好,用括号就好了。在问答中,检查结果是否不为空不会阻止代码中断,也不能保证数据确实存在,结果可能不为空但仍然没有数据存在。正确的说法应该是:if(result && result.data && result.data.length)
  • @BotMaster 我建议点符号作为一般规则更好,因为它允许您在编译时找到错误,而括号则不能。虽然在这种情况下它不会有所作为......是的,你应该检查空数据
  • 换句话说,如果您使用动态类型(例如 Object.但是,如果您要将结果映射到模型中,它会给您带来编译时错误检查的好处。因此,它是更好的 imo
  • 感谢两位额外的 cmets。 @BotMaster - 即使这个应用程序将存在于一个非常受控的环境中,我感谢您帮助对 if 语句进行更强大的检查。再次感谢 Karmacon 帮助我突破了我遇到的这个看似简单的障碍。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-18
  • 2020-12-01
  • 1970-01-01
  • 2011-10-22
  • 1970-01-01
相关资源
最近更新 更多