2012-10-17 1 views
0

Я делаю мобильное приложение в flex 4.5, я хочу получить имя человека и возраст человека, а затем сохранить в базу данных sqlite, которая была сделана моим кодом:не смог получить данные из базы данных sqlite в flex

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_ Способ передачи данных, как:

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 столбец в соответствии с выбранным именем в списке имен людей. - Заранее спасибо

ответ

1

Первая проблема с необходимостью понять модель выполнения async, потому что вы открыли режим async для базы данных sqlite. Вторая проблема с именем столбца 'nameofcity', что таблица персоны не имеет никакого столбца, как вы объявили. Так я изменяю здесь как 'nameofperson' в saveName().

Когда вы вызываете saveName(), убедитесь, что вы вызвали 'saveName()'.

В dataInsertedSuccess() В sqlquery возвращать нет затронутой строки только при повторном запуске INSERT/UPDATE sql query, т. Е. Возвращать целочисленное значение. Поэтому всегда insertData.getResult(). Data is null/undefined.it будет содержать данные, если вы запустите запрос SELECT sql.

  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); 
     } 
+0

Спасибо, что работает очень хорошо. –