将Flex连接到SQLite

时间:2012-05-01 01:22:20

标签: flex sqlite flash-builder

在Flash构建器中,我正在努力从本地数据库中检索数据的基础知识。使用Lita,我创建了一个SQLite数据库,其中包含一个位于“DAO”文件夹中的基本(项)表。它用于填充List。我有两个问题:

  1. 如何嵌入数据库(包含所有预先填充的数据)而无需从头开始重新创建数据库,如许多教程所示?
  2. 为了进行原型设计,如何直接在列表中链接检索单个MXML文件的数据,而不创建许多其他类(好的,在这种情况下,所需类的数量将受到限制),例如:
  3. <?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>
    

2 个答案:

答案 0 :(得分:0)

对于问题1,您可以将数据库添加为项目的资产,在导出版本期间,它将嵌入到安装程序中,然后如果要将其放入localstore文件夹,则可以从代码中复制/移动它。 ..

对于数字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>

答案 1 :(得分:0)

感谢Marcx和Marcos Placona's Blog在本地复制数据库的条目,我提出了这个:

<?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>