0

In Flash builder, I'm struggling with basics of data retrieval from local database. Using Lita, I created a SQLite database with a single basic (item) table located in a "DAO" folder .It is meant to populate a List. and I have 2 problems:

  1. How to embed the database (with all its pre-populated data) without recreating it from scratch as shown in many tutorials ?
  2. For the purpose of prototyping, how to link the data retrieved a single MXML file directly in the list without creating many other classes (ok, in this cases the number of required classes would be limited) such as :
<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
      xmlns:s="library://ns.adobe.com/flex/spark" 
      title="HomeView" >

<fx:Script>

  <![CDATA[

      import flash.data.SQLConnection
      import flash.data.SQLStatement;
      import flash.filesystem.File;
      import flash.filesystem.FileMode;
      import mx.collections.ArrayCollection;`

      private function get myData():ArrayCollection 
      {
          var stmt:SQLStatement = new SQLStatement();
          stmt.sqlConnection = new SQLConnection();

          stmt.sqlConnection.open(File.applicationStorageDirectory.resolvePath("dao/MyDatabase.db"));
          stmt.text = "SELECT id, name FROM Item";

          stmt.execute();
          var result:Array = stmt.getResult().data;

          if (result)
          {
              var list:ArrayCollection = new ArrayCollection();
              list.source(result); 
              return list; 
          } else {
              return null; 
          } 
      }
      ]]>
    </fx:Script>

    <s:List id="list" top="0" bottom="0" left="0" right="0" 
           dataProvider="{myData}" >
    <s:itemRenderer>
    <fx:Component>
    <s:IconItemRenderer label="{myData.name}">
    </s:IconItemRenderer>
    </fx:Component>
    </s:itemRenderer>
    </s:List>
    </s:View>
Ghaag
  • 138
  • 2
  • 11

2 Answers2

0

For the question 1 you can add the database as an asset of the project, during the export release it will be embeded into the installer then if you want to place it into the localstore folder you can copy/move it from code...

For the number 2

import flash.data.SQLConnection
  import flash.data.SQLStatement;
  import flash.filesystem.File;
  import flash.filesystem.FileMode;
  import mx.collections.ArrayCollection;`

  [Bindable]private var resultArr:ArrayCollection = new ArrayCollection();

  private function getData():ArrayCollection 
  {
      var stmt:SQLStatement = new SQLStatement();
      stmt.sqlConnection = new SQLConnection();

      stmt.sqlConnection.open(File.applicationStorageDirectory.resolvePath("dao/MyDatabase.db"));
      stmt.text = "SELECT id, name FROM Item";

      stmt.execute();
      var result:Array = stmt.getResult().data;

      resultArr =  new ArrayCollection();
      if (result)
      {      
          resultArr.source = result;           
      }
  }
  ]]>
</fx:Script>

<s:List id="list" top="0" bottom="0" left="0" right="0" 
       dataProvider="{resultArr}" labelField="name" >
</s:List>
Marcx
  • 6,806
  • 5
  • 46
  • 69
0

Thanks to Marcx and Marcos Placona's Blog entry on copying database locally I came up with this:

<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
      xmlns:s="library://ns.adobe.com/flex/spark" 
      title="HomeView" >

<fx:Script>

  <![CDATA[

      import flash.data.SQLConnection
      import flash.data.SQLStatement;
      import flash.filesystem.File;
      import flash.filesystem.FileMode;
      import mx.collections.ArrayCollection;

      private function get myData():ArrayCollection 
      {
          var myData:String = "dao/MyDatabase.db";
          var embededSessionDB:File = File.applicationDirectory.resolvePath(myData);
          var writeSessionDB:File = File.applicationStorageDirectory.resolvePath(myData);
          // If a writable DB doesn't exist, we then copy it into the app folder so it's writteable
          if (!writeSessionDB.exists) 
          {
             embededSessionDB.copyTo(writeSessionDB);
          }

          var stmt:SQLStatement = new SQLStatement();
          stmt.sqlConnection = new SQLConnection();

          stmt.sqlConnection.open(File.applicationStorageDirectory.resolvePath(myData));
          stmt.text = "SELECT id, name FROM Item";

          stmt.execute();
          var result:Array = stmt.getResult().data;

            stmt.execute();
            var result:Array = stmt.getResult().data;
            var r:ArrayCollection = new ArrayCollection();

            if (result)
            {      
                r.source = result; 
                return r;
            }else{
                return null;
            } 
      }

      [Bindable]private var resultArr:ArrayCollection = getData();

      ]]>

    </fx:Script>

    <s:List id="list" top="0" bottom="0" left="0" right="0" 
           dataProvider="{myData}" label="name">
    </s:List>
    </s:View>
Ghaag
  • 138
  • 2
  • 11