Как получить представление для чтения данных - PullRequest
1 голос
/ 07 декабря 2011

Мне нужно конвертировать много вещей в своей профессии - поэтому я создаю инструмент конвертации для своего телефона с некоторыми конверсиями, которые я часто использую.

Теперь я хочу иметь возможность построить это правильно.Итак, вот мой код:

    <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) Как заполнить конечный вид из информации из базы данных?

Спасибо засовет и помощь.

Ответы [ 3 ]

1 голос
/ 06 мая 2012

Я только что закончил приложение около месяца назад, которое использует, как мне кажется, самое «гибкое» решение.(хе-хе-хе)

(Первый ответ :) Если вы хорошо знакомы с (хорошим) дизайном базы данных, вы можете создать базу данных 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

... в этом сообщениизаймет больше времени, чем я ожидал! хе-хе-хе; P = D)

В основном, что это было бы: таблицы для категорий (например, объем, длина и т. д.) и другой для конкретных пар имя / значение ("км доmi "= 0.62137119224 [каждый в отдельных столбцах]) со столбцом id категории в.

Затем на вашей домашней странице у вас есть init () создать DAO (объект доступа к данным [исследование, если вы не знаете,уже]) для таблицы категорий, затем извлеките категории в коллекцию ArrayCollection и установите ее в качестве dataProvider в вашем списке категорий (на домашнем экране - или где угодно).

(Второй ответ :)обработчик для списка категорий захватывает selectedItem и передает его как второй параметр in navigator.pushView ().Это отправит VO (Value Object - другой объект для исследования, если вы его не знаете) в новое представление как свойство «data».

В «push-представлении» используйте ваш обработчик creationComplete для«поймать» (использовать) переменную данных, которая будет содержать имя категории и идентификатор.Создайте новый DAO для таблицы значений, а затем используйте значение data.id для загрузки всех ваших значений с этим идентификатором категории.Затем установите новую коллекцию ArrayCollection в качестве dataProvider вашего списка значений.

Затем создайте другое представление для выбора значений для редактирования таким же образом.За исключением окончательного представления в этом «потоке» будет форма с входами для категории, имени и значения (с кнопками сохранения и отмены), которая также будет заполнена соответствующими данными.(Примечание: используйте DAO категории, чтобы получить имена категорий, чтобы имена и идентификаторы категорий были доступны при изменении категории.

... Тогда это просто вопрос внедрения методов вставки и обновления вЭто представление и SQL & методы, необходимые в каждом 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>
0 голосов
/ 13 декабря 2011

Вы смотрели на использование ресурсов?Или LSO?

При сохранении данных Flex у вас есть 4 основных варианта.

  1. Реляционные базы данных (здесь это кажется излишним)
  2. XML (который вам уже кажется удобнымwith)
  3. Связки ресурсов
  4. Локальные общие объекты

Пример 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 отслеживаетдинамические данные (просмотр настроек и т. д.).

0 голосов
/ 09 декабря 2011

Восстановление данных

Как я понимаю, ваша проблема, вам не нужно держать соединение открытым.

  1. Получить данные из вашей базы данных
  2. Parseи хранить извлеченные данные в идеальной коллекции ArrayCollection (вы не хотите обрабатывать объекты на основе XML, они хороши при манипулировании значениями String, но они сразу становятся проблемой в .as, когда вы хотите выполнить преобразование типови расширенные операции добавления и удаления)

Общее преобразование

Затем, с привязкой, как в следующем примере, все, что вам нужно сделать, это всегда иметь два преобразования при преобразовании значения изединица в другую:

  1. преобразование в определенную единицу (в идеале, в единицу СИ, как в моем примере)
  2. преобразование из единицы СИ в желаемую единицу.

Образец

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