如何获取视图来读取数据

时间:2011-12-06 20:54:00

标签: flex flex-mobile

我需要在我的职业中转换很多东西 - 所以我正在为我的手机构建一个转换工具,其中包含一些我经常使用的转换。

现在,我希望能够正确构建它。到目前为止,这是我的代码:

    <s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" title="Length">

<fx:Script>
    <![CDATA[
        protected function button1_clickHandler(event:MouseEvent):void
        {
            var Result:String;
            var Finish:Number;
            var Start:Number = parseFloat(Input.text);
            Finish = Start * convert.selectedItem.data; 
            Result = String(Finish);
            answer.text = Result;

        }
    ]]>
</fx:Script>

<fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>




<s:TextInput id="Input" x="20" y="46"/>
<s:SpinnerListContainer x="140" y="122" width="200" height="200">
    <s:SpinnerList id="convert" height="100%" width="100%" labelField="label" selectedIndex="1">
        <s:ArrayList>
            <fx:Object label="km to mi" data="0.62137119224"></fx:Object>
            <fx:Object label="km to yd" data="1093.6132983 "></fx:Object>
            <fx:Object label="km to ft" data="3280.839895"></fx:Object>
            <fx:Object label="km to in" data="39370.07874"></fx:Object>
            <fx:Object label="km to m" data="1000"></fx:Object>
            <fx:Object label="km to cm" data="100000"></fx:Object>
            <fx:Object label="km to mm" data="1000000"></fx:Object>

    </s:ArrayList>
            </s:SpinnerList>
        </s:SpinnerListContainer>
        <s:Label id="answer" x="66" y="533" width="348" text="Answer"/>
        <s:Button x="66" y="377" width="338"           click="button1_clickHandler(event)" label="Button"/>

    </View>

正如您所看到的,我将遇到一些问题:

1)所有内容都是硬编码的,如果我想添加,删除或更改数组中的元素,那将会有点痛苦。

2)我有一个基本相同的视图,我的音量和体重转换。遇到同样的问题。

我想做什么,但是我在理解方面遇到了一些麻烦,将所有硬编码的东西放在一个地方并且根据我以前的观点显示相同的视图,这只是一个简单的,难的编码列表。

我正在考虑像xml表一样,并在对象中添加category = "length"category = "weight"元素,这样我就可以在列表中的xml中显示类别,然后当我点击“长度”,它会从此列表中读取标签+数据。这是一个好的解决方案吗?我究竟如何让selectedItem记住视图应该从哪个xml列表中填充?

拥有多个xml文件会更好吗?但这仍然意味着我需要在需要时更新一大堆地方。

基本上,我需要帮助:

所以 - 现在问题是双重的:

1)如何在多个视图之间保持与xml / db的连接?

2)如何从db?

中的信息填充结束视图

感谢您的建议和帮助。

3 个答案:

答案 0 :(得分:1)

我刚刚在一个月前完成了一个应用程序,它使用了我认为最“灵活”的解决方案。 (呵呵呵呵)

(第一回答:) 如果您熟悉(良好)数据库设计,您可以设计一个SQLite数据库,允许您添加到&amp;修改您正在使用的所有数据。

(如果没有,我建议: http://www.amazon.com/The-Art-SQL-Stephane-Faroult/dp/0596008945/ref=sr_1_14?s=books&ie=UTF8&qid=1336262973&sr=1-14

http://www.amazon.com/SQL-Demystified-Andrew-Oppel/dp/0072262249/ref=sr_1_1?s=books&ie=UTF8&qid=1336263052&sr=1-1

......这篇文章比我预期的要花费更长的时间! hehehhehee; P = D)

基本上它是什么: 类别表(例如音量,长度等)和另一个特定名称/值对(“km to mi”= 0.62137119224 [各自在不同的列中]),类别id列为。

然后在您的主页上,您的init()为类别表创建一个DAO(数据访问对象[研究,如果您还不知道]),然后将类别提取到ArrayCollection并将其设置为dataProvider在您的类别列表上(在主视图上 - 或在任何地方)。

(第二回答:) 让类别列表的更改处理程序获取selectedItem并将其作为navigator.pushView()中的第二个参数传递。这将把VO(值对象 - 另一个用于研究,如果你不知道它)发送到新视图作为“数据”属性。

在“推送视图”中,使用您的creationComplete处理程序“捕获”(使用)数据变量,该变量将包含类别的名称和ID。为values表创建一个新的DAO,然后使用data.id值加载具有该类别id的所有值。然后将新的ArrayCollection设置为值列表的dataProvider。

然后创建另一个视图,以选择要以相同方式编辑的值。除了最终视图之外,“流程”将是一个包含类别,名称和输入的输入的表单。值(使用保存和取消按钮)也会填充适当的数据。 (注意:使用类别DAO获取类别的名称,以便在更改类别时可以使用类别名称和ID。

...那么这只是实现插入和放大的问题。更新该View和SQL&amp; amp;的方法每个DAO都需要的方法。

您可以使用Lita(http://www.dehats.com/drupal/?q=node/58)构建,设计,预填充数据库。

...我可以带回一些不错的示例代码/文件(如果我记得的话)

我为那些正在阅读的人做了一些例子,希望我能......

//////////////////////////////////////  
//VO (Value Object)  
//Category.as  
//////////////////////////////////////  


package dao  
{  

[Bindable]//Makes all public properties bindable
public class Category
{   

    import mx.collections.ArrayCollection;

    public var id:int = -1;
    public var categoryName:String;
    private var categoryDao:CategoryDAO;

    public function Category() {}



    public function get exists():Boolean {
        return this.id > -1;
    }


    //"Super" convenient methods
    //Not really part of Value Objects / Value Object Pattern
    //May actually be a bad practice if you have many VO instances,
    //you have the potential for a DAO instance in each
    //when only one instance could be used.

    public function insert():void {
        if( !categoryDao ){ categoryDao = new CategoryDAO;}
        categoryDao.insert( this );
    }

    public function update():void {
        if( !categoryDao ){ categoryDao = new CategoryDAO;}
        categoryDao.update( this );
    }

    public function deleteRow():void {
        if( !categoryDao ){ categoryDao = new CategoryDAO;}
        categoryDao.deleteRow( this );
    }
}
}


//////////////////////////////////////  
//DAO (Data Access Object)  
//CatagoryDAO.as    
//////////////////////////////////////  


package dao
{
import flash.data.SQLConnection;
import flash.data.SQLStatement;
import flash.filesystem.File;

import mx.collections.ArrayCollection;

public class CategoryDAO
{
    public static var _sqlConnection:SQLConnection;
    public var failed:Boolean;
    public var errorMessage:*;

    public function CategoryDAO() {
    }

    public function getAll():ArrayCollection
    {
        var sql:String = "SELECT * FROM categories"                     
        + " ORDER BY categoryName ASC";
        var stmt:SQLStatement = new SQLStatement();
        stmt.sqlConnection = sqlConnection;
        stmt.text = sql;
        stmt.execute();
        var result:Array = stmt.getResult().data;
        if( result ){
            var list:ArrayCollection = new ArrayCollection();
            for (var i:int=0; i < result.length; i++){
                list.addItem( buildVO( result[i] ) );   
            }
            return list;
        } else {
            return null;
        }
    }

    public function getByCategoryId(id:int):Category
    {
        var sql:String = "SELECT * FROM categories WHERE id=?";
        var stmt:SQLStatement = new SQLStatement();
        stmt.sqlConnection = sqlConnection;
        stmt.text = sql;
        stmt.parameters[0] = id;
        stmt.execute();
        var result:Array = stmt.getResult().data;
        if( result && result.length == 1 ){
            return buildVO( result[0] );
        } else {
            return null;
        }
    }

    public function insert(category:Category):void
    {
        var sql:String = 
            "INSERT INTO categories ( categoryName )" + 
            " VALUES ( :name )";
        var stmt:SQLStatement = new SQLStatement();
        stmt.sqlConnection = sqlConnection;
        stmt.text = sql;
        stmt.parameters[":name"] = category.categoryName;
        this.execute( stmt );
    }

    public function update(category:Category):void
    {
        var sql:String = 
            "UPDATE categories" +
            " SET categoryName = :name" +
            " WHERE id = :id";
        var stmt:SQLStatement = new SQLStatement();
        stmt.sqlConnection = sqlConnection;
        stmt.text = sql;
        stmt.parameters[":name"] = category.categoryName;
        stmt.parameters[":id"] = category.id;
        this.execute( stmt );
    }

    public function deleteRow(category:Category):void {
        var sql:String = 
            "DELETE FROM categories" +
            " WHERE id = :id";
        var stmt:SQLStatement = new SQLStatement();
        stmt.sqlConnection = sqlConnection;
        stmt.text = sql;
        stmt.parameters[":id"] = category.id;
        this.execute( stmt );
    }

    protected function execute(stmt:SQLStatement):void {
        try {
            stmt.execute();
        } catch(error:Error) {
            this.failed = true;
            this.errorMessage = error.message;
        } 
    }

    protected function buildVO(o:Object):Category
    {
        var category:Category = new Category();
        category.id = o.id;
        category.categoryName = o.categoryName;
        return category;
    }


    public function get sqlConnection():SQLConnection
    {
        if (_sqlConnection) return _sqlConnection;
        var file:File = 
               File.documentsDirectory.resolvePath(DbUtility.DB_FILE_NAME);
        var fileExists:Boolean = file.exists;
        _sqlConnection = new SQLConnection();
        _sqlConnection.open(file);
        return _sqlConnection;
    }
}
}



//////////////////////////////////////  
//CategoryView.mxml  
//////////////////////////////////////  

<?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"
    xmlns:dao="dao.*"
    opaqueBackground="#111111"
    title="All Categorys"
    creationComplete="init()">
<fx:Script>
    <![CDATA[
        import dao.DbUtility;
        import dao.DropPoint;
        import dao.Category;
        import dao.CategoryDAO;

        protected var dbVerifyUtil:DbUtility

        protected function init():void
        {
            dbVerifyUtil = new DbUtility;
            dbVerifyUtil.confirmDb();

            if( dbVerifyUtil.dbExists() ){
                var categorysDAO:CategoryDAO = new CategoryDAO;
                categoryList.dataProvider = categorysDAO.getAll();
            }

        }

        protected function categorySelected():void
        {
            navigator.pushView( CategoryListView, 
                    categoryList.selectedItem );
        }

        protected function newCategory():void
        {
            navigator.pushView( EditCategoryView );
        }

        protected function viewCategory():void
        {
            navigator.pushView( CategoryListView, 
                    categoryList.selectedItem );
        }

    ]]>
</fx:Script>


<s:List id="categoryList"
        left="10" right="10" top="10" bottom="85"
        change="viewCategory()"
        dataProvider="{data}"
        itemRenderer="irs.CategoryIR">
</s:List>


<s:Button label="Add Category"
          left="104" bottom="10" height="43"
          click="newCategory()"/>
<s:Label text="Touch a category to view or edit it."
         y="326" horizontalCenter="0"/>
</s:View>


//////////////////////////////////////  
//CategoryListView.mxml  
//////////////////////////////////////  

<?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"
    xmlns:dao="dao.*"
    creationComplete="init()">

<fx:Script>
    <![CDATA[
        import dao.Value;//Value VO
        import dao.Category;//Category VO

        import mx.collections.ArrayCollection;

        import spark.events.IndexChangeEvent;

        private var category:Category;

        protected function init():void
        {
            var category:Category = data as Category;
            listValues.dataProvider =
                    valueDAO.getByCategoryId(
                            category.id );
        }

        protected function editValue():void
        {
            navigator.pushView( EditValueView,
                    listValues.selectedItem );
        }

        protected function editCategory():void
        {
            navigator.pushView( EditCategoryView, category );
        }

    ]]>
</fx:Script>

<s:viewMenuItems>
    <s:ViewMenuItem label="Edit Category"
                    click="editCategory()"
                    icon="@Embed('assets/edit.png')"/>
    <s:ViewMenuItem label="Add Location"
                    click="addLocation()"
                    icon="@Embed('assets/plus.png')"/>
</s:viewMenuItems>

<s:List id="listValues"
        left="10" right="10" top="10" bottom="60"
        labelFunction="labelValue"
        change="editValue()"
        itemRenderer="irs.ValueIR">
</s:List>
</s:View>

答案 1 :(得分:0)

数据检索

据我了解您的问题,您无需保持连接打开。

  1. 从数据库中检索数据
  2. 解析并存储检索到的 理想情况下,集合中的数据是一个ArrayCollection(你不想这样做 处理基于XML的对象,它们在操作String时很好 价值观,但当你想要的时候,它们会立即成为.as的痛苦 执行类型转换和高级添加和删除操作)
  3. 通用转换

    然后,通过以下示例中的绑定,当您将值从一个单位转换为另一个单元时,您所要做的就是进行两次转换:

    1. 转换为定义的单位(理想情况下是SI单位,如我所知 例如)
    2. 从SI单位转换为所需单位。
    3. 样品

      <?xml version="1.0" encoding="utf-8"?>
      <s:Application 
          xmlns:fx="http://ns.adobe.com/mxml/2009" 
          xmlns:s="library://ns.adobe.com/flex/spark" 
          xmlns:mx="library://ns.adobe.com/flex/mx" 
          minWidth="400" minHeight="300">
          <s:layout>
              <s:VerticalLayout/>
          </s:layout>
          <fx:Script>
              <![CDATA[
      
                  import mx.collections.ArrayCollection;
      
                  [Bindable]
                  private var unitz:ArrayCollection = new ArrayCollection([
                      {
                          label:"Length",
                          units: new ArrayCollection([
                              {label: "meter", toSI: 1},
                              {label: "kilometer", toSI: 1000},
                              {label: "inch", toSI: 0.0254}
                          ])
                      },
                      {
                          label:"Temperature",
                          units: new ArrayCollection([
                              {label: "kelvin", toSI: 1},
                              {label: "celsius", toSI: 274.15},
                              {label: "farenheit", toSI: 255.927778}
                          ])
                      }
                  ]);
      
                  private function resetFields():void
                  {
                      fromValue.text = "";
                      toValue.text = "";
                  }
      
                  private function onInputChange():void
                  {
                      var fu:Object = fromUnitCB.selectedItem;
                      var tu:Object = toUnitCB.selectedItem;
      
                      toValue.text = (Number(fromValue.text)*fu.toSI/tu.toSI).toString();
                  }
      
              ]]>
          </fx:Script>
      
          <s:HGroup width="100%" height="40">
              <s:ComboBox
                  id="categoryCB"
                  dataProvider="{unitz}"
                  change="resetFields()"
              />
              <s:ComboBox id="fromUnitCB" dataProvider="{categoryCB.selectedItem.units}"/>
              <s:ComboBox id="toUnitCB" dataProvider="{categoryCB.selectedItem.units}"/>
          </s:HGroup>
          <s:HGroup width="100%">
              <s:TextInput id="fromValue" change="onInputChange()"/>
              <s:Label id="toValue"/>
          </s:HGroup>
      </s:Application>
      

答案 2 :(得分:0)

您是否考虑过使用资源包?还是LSO?

持久保存Flex数据时,您有4个主要选项。

  1. 关系数据库(这里看起来有些过分)
  2. XML(您已经习惯了)
  3. Resource Bundles
  4. Local Shared Objects
  5. 上面链接的LSO示例(#4)为您的问题提供了一个潜在的解决方案:

      

    ...我究竟如何让selectedItem记住视图应该从哪个xml列表中填充?

    片段:

    public function initApp():void {
        mySO = SharedObject.getLocal("mydata");
        if (mySO.data.visitDate==null) {
           welcomeMessage = "Hello first-timer!"
        } else {
           welcomeMessage = "Welcome back. You last visited on " +
              getVisitDate();
        }
     }
    
    private function getVisitDate():Date {
       return mySO.data.visitDate;
    }
    
    private function storeDate():void {
       mySO.data.visitDate = new Date();
       mySO.flush();
    }
    
    private function deleteLSO():void {
       // Deletes the SharedObject from the client machine.
       // Next time they log in, they will be a 'first-timer'.
       mySO.clear();
    }
    

    我建议使用XML和LSO或资源包和LSO的组合 - 您的XML / RB存储不变的静态数据,LSO会跟踪动态数据(视图设置等)。 / p>