1

私は自分の職業で多くのものを変換する必要があります-それで私は私がよく使う変換のいくつかで私の電話のための変換ツールを構築しています。

今、私はこれを適切に構築できるようにしたいと思います。これまでのところ、これが私のコードです:

    <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)私は、体積と重量の変換について本質的に同じ見解を持っています。同じ問題で。

私がやりたいことですが、理解するのに苦労しています。ハードコードされたものをすべて1か所にまとめ、以前のビューに基づいて同じビューに表示させることです。これは、単純なハードコードされたリストです。 。

xmlシートのようなものを考えており、オブジェクトにcategory = "length"orcategory = "weight"要素を追加して、リスト内のxmlからカテゴリを表示できるようにします。次に、[長さ]をクリックすると、このリストからラベルとデータが読み取られます。 。それは良い解決策ですか?selectedItemまた、XMLリストのどの部分からビューにデータを入力する必要があるかを正確に覚えておくにはどうすればよいですか?

複数のxmlファイルがある方が良いでしょうか?しかし、それでも、必要なときにたくさんの場所を更新する必要があることを意味します。

基本的に、私は以下の支援が必要です:

だから-今、質問は2つあります:

1)xml / dbへの接続を複数のビューで開いたままにする方法は?

2)データベースからの情報からエンドビューにデータを入力する方法は?

アドバイスと助けてくれてありがとう。

4

3 に答える 3

1

私は約1か月前にアプリを完成させました。これは、最も「柔軟な」ソリューションであると私が考えるものを使用しています。(へへへへ)

(最初の回答:)(優れた)データベース設計に精通している場合は、使用しているすべてのデータを追加および変更できるSQLiteデータベースを設計できます。

(そうでない場合は、次のいずれかをお勧めします: 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として設定します。リスト(ホームビュー-またはどこでも)。

(2番目の回答:)カテゴリリストの変更ハンドラーにselectedItemを取得させ、navigator.pushView()の2番目のパラメーターとして渡します。これにより、VO(値オブジェクト-わからない場合は別のオブジェクト)が「データ」プロパティとして新しいビューに送信されます。

「プッシュビュー」で、creationCompleteハンドラーを使用して、カテゴリの名前とIDを含むデータ変数を「キャッチ」(使用)します。値テーブルの新しいDAOを作成し、data.id値を使用して、そのカテゴリIDを持つすべての値をロードします。次に、新しいArrayCollectionを値リストのdataProviderとして設定します。

次に、同じ方法で編集する値を選択するための別のビューを作成します。その「フロー」の最終ビューを除いて、カテゴリ、名前、および値(保存およびキャンセルボタン付き)の入力を含むフォームであり、適切なデータも入力されます。(注:カテゴリーDAOを使用してカテゴリーの名前を取得し、カテゴリーを変更した場合にカテゴリー名とIDが使用できるようにします。

...次に、そのビューに挿入と更新のメソッドを実装し、各DAOに必要なSQLとメソッドを実装するだけです。

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>
于 2012-05-06T01:09:10.507 に答える
0

リソースバンドルの使用を検討しましたか?またはLSO?

Flexデータを永続化する場合、4つの主なオプションがあります。

  1. リレーショナルデータベース(ここではやり過ぎのようです)
  2. XML(あなたはすでに慣れているようです)
  3. リソースバンドル
  4. ローカル共有オブジェクト

上にリンクされているLSOの例(#4)は、あなたの質問に対する潜在的な解決策を提供します。

...ビューにデータを入力する必要があるxmlリストのどの部分をselectedItemに記憶させるにはどうすればよいですか?

スニペット:

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は動的データ(ビュー設定など)を追跡します。

于 2011-12-13T17:40:49.897 に答える
0

データの取得

私はあなたの問題を理解しているので、接続を開いたままにする必要はありません。

  1. データベースからデータを取得します
  2. 取得したデータを解析してコレクションに格納するのが理想的です(XMLベースのオブジェクトは処理したくないので、文字列値を操作する場合は問題ありませんが、型を実行する場合と同様に、すぐに問題になります-変換および高度な追加および削除操作)

一般的な変換

次に、次のサンプルのようにバインディングを使用すると、値をユニットから別のユニットに変換するときに、常に2つの変換を行う必要があります。

  1. 定義された単位への変換(私の例のように、理想的にはSI単位)
  2. SI単位から目的の単位への変換。

サンプル

<?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>
于 2011-12-09T10:28:25.097 に答える