我正在使用flex 4.5创建一个移动应用程序,我想得到人的名字和人的年龄然后保存到sqlite数据库完成我的代码看起来像:
public var personNamesDB:File;
public var dbConnection:SQLConnection;
protected function createDatabase(event:FlexEvent):void
{
// TODO Auto-generated method stub
personNamesDB = File.applicationStorageDirectory.resolvePath("person.db");
dbConnection = new SQLConnection();
dbConnection.openAsync(personNamesDB, SQLMode.CREATE);
dbConnection.addEventListener(SQLEvent.OPEN, onDatabaseOpened);
dbConnection.addEventListener(SQLEvent.CLOSE, onDatabaseClosed);
}// end createDatabase method
protected function onDatabaseOpened(arshayEvent:SQLEvent):void
{
trace("DB Opened");
var statement:SQLStatement = new SQLStatement();
statement.sqlConnection = dbConnection;
statement.text = "CREATE TABLE IF NOT EXISTS personinfo(id INTEGER PRIMARY KEY AUTOINCREMENT, nameofperson TEXT, ageofperson TEXT)";
statement.execute();
// for showing saved city names in list on App start up
showSavedNames();
trace("table created");
}
现在插入数据代码是:
///////////////////////////////////
public var insertData:SQLStatement
protected function saveName():void
{
// SQLite Usage
insertData = new SQLStatement();
insertData.sqlConnection = dbConnection;
insertData.text = "INSERT INTO personinfo(nameofcity, ageofperson) VALUES(:nameofcity, :ageofperson)";
insertData.parameters[":nameofcity"] =nameInput.text;
insertData.parameters[":ageofperson"] = ageInput.text;
insertData.addEventListener(SQLEvent.RESULT, dataInsertedSuccess);
trace("Name " + nameInput.text);
insertData.execute();
showSavedNames();
}
protected function dataInsertedSuccess(event:SQLEvent):void
{
trace(insertData.getResult().data);
}
//////////////////////////////////////////////
public var selectQuery:SQLStatement;
protected function showSavedNames():void
{
selectQuery = new SQLStatement();
selectQuery.sqlConnection = dbConnection;
selectQuery.text = "SELECT * FROM personinfo ORDER BY nameofperson ASC";
selectQuery.addEventListener(SQLEvent.RESULT, showNamesInList);
selectQuery.execute();
}
protected function showNamesInList(event:SQLEvent):void
{
listOfAddedNames.dataProvider = new ArrayCollection(selectQuery.getResult().data);
}
列表控件的mxml代码是:
<s:List id="listOfAddedNames" width="345" height="100%" labelField="nameofperson"
click="get_names_data(event)"/>
现在get_names_data方法就像:
public var selectNameQuery:SQLStatement;
protected function get_names_data(event:MouseEvent):void
{
// TODO Auto-generated method stub
var currentName:String = listOfAddedNames.selectedItem.nameofperson;
selectNameQuery = new SQLStatement();
selectNameQuery.sqlConnection =dbConnection;
selectNameQuery.text = "SELECT ageofperson FROM personinfo WHERE (nameofperson = '" + currentName + "')";
selectNameQuery.addEventListener(SQLEvent.RESULT, nowGotAge);
selectNameQuery.execute();
trace("current selected >> "+currentName);
}
protected function nowGotAge(event:SQLEvent):void
{
trace("Age of selected Name is >> "+selectNameQuery.getResult().data.ageofperson);
}
在这一行:
trace("Age of selected Name is >> "+selectNameQuery.getResult().data.ageofperson);
没有从数据库中获取数据并且trce显示“未定义”请为我解决此问题,并告诉我如何根据人名列表中的选定名称从ageofperson列中获取数据 - 提前致谢
答案 0 :(得分:1)
首先需要了解异步执行模型,因为您打开了sqlite数据库异步模式。 列名'nameofcity'的第二个问题,即person表没有像你声明的任何列。所以我在这里修改为saveName()中的'nameofperson'。
如果你调用saveName(),请确保你调用了'saveName()'。
在dataInsertedSuccess()中在sqlquery中只有在运行时才返回受影响的行的INSERT / UPDATE sql查询,即只返回整数值。所以总是insertData.getResult()。data是null / undefined。如果运行SELECT sql query,它将包含(s)数据。
public var personNamesDB:File;
public var dbConnection:SQLConnection;
protected function createDatabase(event:FlexEvent):void
{
// TODO Auto-generated method stub
personNamesDB = File.applicationStorageDirectory.resolvePath("person.db");
dbConnection = new SQLConnection();
dbConnection.openAsync(personNamesDB, SQLMode.CREATE);
dbConnection.addEventListener(SQLEvent.OPEN, onDatabaseOpened);
dbConnection.addEventListener(SQLEvent.CLOSE, onDatabaseClosed);
}// end createDatabase method
protected function onDatabaseOpened(arshayEvent:SQLEvent):void
{
trace("DB Opened");
var statement:SQLStatement = new SQLStatement();
statement.sqlConnection = dbConnection;
statement.text = "CREATE TABLE IF NOT EXISTS personinfo(id INTEGER PRIMARY KEY AUTOINCREMENT, nameofperson TEXT, ageofperson TEXT)";
statement.addEventListener(SQLEvent.RESULT ,function(event:SQLEvent):void
{
trace("table created");
// for showing saved city names in list on App start up
showSavedNames(); **//Need to call after get success event**
});
statement.execute();
}
public var insertData:SQLStatement
protected function saveName():void
{
// SQLite Usage
insertData = new SQLStatement();
insertData.sqlConnection = dbConnection;
insertData.text = "INSERT INTO personinfo(nameofperson, ageofperson) VALUES(:nameofperson, :ageofperson)";
insertData.parameters[":nameofperson"] = "Xyz";
insertData.parameters[":ageofperson"] = "27"
insertData.addEventListener(SQLEvent.RESULT, dataInsertedSuccess);
insertData.addEventListener(SQLErrorEvent.ERROR, function(event:SQLErrorEvent):void
{
//details "table 'personinfo' has no column named 'nameofcity'"
trace(event.error.message.toString());
// showSavedNames();
});
insertData.execute();
}
protected function dataInsertedSuccess(event:SQLEvent):void
{
trace("Success :: " + insertData.getResult().rowsAffected);
showSavedNames();
}
//////////////////////////////////////////////
public var selectQuery:SQLStatement;
protected function showSavedNames():void
{
selectQuery = new SQLStatement();
selectQuery.sqlConnection = dbConnection;
selectQuery.text = "SELECT * FROM personinfo ORDER BY nameofperson ASC";
selectQuery.addEventListener(SQLEvent.RESULT, showNamesInList);
selectQuery.execute();
}
protected function showNamesInList(event:SQLEvent):void
{
listOfAddedNames.dataProvider = new ArrayCollection(selectQuery.getResult().data);
}
public var selectNameQuery:SQLStatement;
protected function get_names_data(event:MouseEvent):void
{
//Need not to get ageofperson from db
Alert.show(listOfAddedNames.selectedItem.ageofperson);
//Any way continue your way
var currentName:String = listOfAddedNames.selectedItem.nameofperson;
selectNameQuery = new SQLStatement();
selectNameQuery.sqlConnection =dbConnection;
selectNameQuery.text = "SELECT ageofperson FROM personinfo WHERE nameofperson = '" + currentName + "'";
selectNameQuery.addEventListener(SQLEvent.RESULT, nowGotAge);
selectNameQuery.execute();
trace("current selected >> "+currentName);
}
protected function nowGotAge(event:SQLEvent):void
{
trace("Age of selected Name is >> "+selectNameQuery.getResult().data[0].ageofperson);
}