Как отправить данные массива SharedObject в PHP WS для запросов к БД (Flex) - PullRequest
1 голос
/ 27 июля 2011

В настоящее время я занимаюсь разработкой приложения для Android с использованием Flex 4.5.1, и у меня возникла проблема при попытке передать данные, хранящиеся в массиве SharedObject, в мою веб-службу для запроса базы данных.код ниже показывает, как я храню данные в SharedObject:

var so:SharedObject = SharedObject.getLocal("app");
            public var prefsArray:ArrayCollection = new ArrayCollection(so.data.prefs);

protected function prefs_btn_click(event:MouseEvent):void
            {

                prefsArray.source.push(getFrsByIDResult.lastResult.id);
                so.data.prefs = [prefsArray];

                var flushStatus:String = so.flush();
                if (flushStatus != null) {
                    switch(flushStatus) {
                        case SharedObjectFlushStatus.PENDING:
                            so.addEventListener(NetStatusEvent.NET_STATUS,
                                onFlushStatus);
                            break;
                        case SharedObjectFlushStatus.FLUSHED:
                        trace("success");
                        break;
                    }
                }
            }

            protected function onFlushStatus(event:NetStatusEvent):void 
            {           
                trace(event.info.code);
            }

Я протестировал SharedObject, чтобы убедиться, что информация вводится в него правильно, и все выглядит нормально.Теперь я использовал приведенный ниже код, чтобы извлечь данные из SharedObject и попытаться отправить их в веб-службу PHP для выполнения запроса к БД.

var so:SharedObject = SharedObject.getLocal("app"); 
            var arrCol:ArrayCollection = new ArrayCollection(so.data.prefs);
            var str:String = new String(arrCol.toString());

            protected function list_creationCompleteHandler(event:FlexEvent):void
            {
                getPrefsByprefIdsResult.token = prefsService.getPrefsByPrefIds(so.data.prefs);          
            }

Я протестировал Web-сервис во Flex и имеюон настроен на получение массива Ints ( int [] ) и работает, когда я запускаю на нем тестовую операцию с двумя фиктивными значениями.Однако когда я пытаюсь использовать приведенный выше код для передачи веб-службы данных общего объекта, я получаю эту ошибку:

TypeError: Error #1034: Type Coercion failed: cannot convert []@97e97e1 to mx.collections.ArrayCollection.
    at views::**************/list_creationCompleteHandler()[C:\Users\Jack\Adobe Flash Builder 4.5\****************\src\views\*******************.mxml:25]
    at views::*********************/__list_creationComplete()[C:\Users\Jack\Adobe Flash Builder 4.5\****************\src\views\***************.mxml:94]
    at flash.events::EventDispatcher/dispatchEventFunction()
    at flash.events::EventDispatcher/dispatchEvent()
    at mx.core::UIComponent/dispatchEvent()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\core\UIComponent.as:13128]
    at mx.core::UIComponent/set initialized()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\core\UIComponent.as:1818]
    at mx.managers::LayoutManager/validateClient()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\managers\LayoutManager.as:1090]
    at mx.core::UIComponent/validateNow()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\core\UIComponent.as:8067]
    at spark.components::ViewNavigator/commitNavigatorAction()[E:\dev\4.5.1\frameworks\projects\mobilecomponents\src\spark\components\ViewNavigator.as:1878]
    at spark.components::ViewNavigator/commitProperties()[E:\dev\4.5.1\frameworks\projects\mobilecomponents\src\spark\components\ViewNavigator.as:1236]
    at mx.core::UIComponent/validateProperties()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\core\UIComponent.as:8209]
    at mx.managers::LayoutManager/validateProperties()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\managers\LayoutManager.as:597]
    at mx.managers::LayoutManager/doPhasedInstantiation()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\managers\LayoutManager.as:783]
    at mx.managers::LayoutManager/doPhasedInstantiationCallback()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\managers\LayoutManager.as:1180]

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

Спасибо


хорошо, поэтому позвольте мне объяснить более подробно.Это было разработано для приложения для Android, как я уже сказал, но я пытаюсь постоянно сохранять закладки с использованием локального общего объекта.

Первый фрагмент кода, который вы видите выше, предназначен для созданияАтрибут LSO для закладки, которую я хочу создать, и представьте, что может быть несколько закладок, установленных в разное время, как в веб-браузере.Единственный способ, который я смог найти, - это сохранить эти элементы / детали в массиве, который я извлек, а затем обновить перед сохранением в LSO и сохранением.

Второй фрагмент кода, связанный с представлением "Страница закладок »со списком всего контента, который я добавил в закладки.Теперь я хотел, чтобы я мог вызвать атрибут LSO, который содержал идентификаторы закладок, а затем загрузить их данные в виде списка.

Мне удалось создать LSO исохраняйте детали закладок и позволяйте их обновлять и добавлять записи.Также я убедился, что имеющийся у меня PHP-код извлекает все объекты базы данных, относящиеся к массиву идентификаторов, и это было проверено с помощью flex.Единственное, что я не могу сделать, это передать идентификаторы в файл веб-службы PHP.Код в файле веб-службы приведен ниже, если это поможет:

public function getPrefsByPrefIds($PrefIds) {

      $stmt = mysqli_prepare($this->connection, "SELECT * FROM $this->tablename WHERE $this->tablename.id IN(" .implode(",", $PrefIds). ")");       
      $this->throwExceptionOnError();

      mysqli_stmt_execute($stmt);
      $this->throwExceptionOnError();

      $rows = array();
      mysqli_stmt_bind_result($stmt, $row->id, $row->name, $row->desc);

     while (mysqli_stmt_fetch($stmt)) {
          $rows[] = $row;
          $row = new stdClass();
          mysqli_stmt_bind_result($stmt, $row->id, $row->name, $row->desc);
        }

      mysqli_stmt_free_result($stmt);
      mysqli_close($this->connection);
      return $rows;
    }

Да, я уже пробовал это, но спасибо.Я сам добился некоторого прогресса, экспериментируя с различными типами объектов, которые могут храниться в SharedObjects.Мне удалось получить часть решения, работающую с этим кодом:

Этот код предназначен для захвата информации о бумарке и сохранения ее в arrayCollection перед ее передачей в bytesArray и сохранением * 1031.*

var so:SharedObject = SharedObject.getLocal("app");
            public var prefArray:ArrayCollection = new ArrayCollection(so.data.prefs);

            protected function prefs_btn_click(event:MouseEvent):void
            {               
                prefArray.source.push(getCompaniesByIDResult.lastResult.id);
                so.data.prefs = [prefArray];

                var bytes:ByteArray = new ByteArray();
                bytes.writeObject(prefArray);

                so.data.ac  = bytes;

                var flushStatus:String = so.flush();
                if (flushStatus != null) {
                    switch(flushStatus) {
                        case SharedObjectFlushStatus.PENDING:
                            so.addEventListener(NetStatusEvent.NET_STATUS,
                                onFlushStatus);
                            break;
                        case SharedObjectFlushStatus.FLUSHED:
                        trace("success");
                        break;
                    }
                }
            }

            protected function onFlushStatus(event:NetStatusEvent):void
            {           
                trace(event.info.code);
            }

Этот следующий код предназначен для извлечения этой информации из байтового массива SahredObjects и помещения ее обратно в коллекцию массивов

var so:SharedObject = SharedObject.getLocal("app");               
            var ba:ByteArray = so.data.ac as ByteArray;
            var ac:ArrayCollection;


            protected function list_creationCompleteHandler(event:FlexEvent):void
            {
                ba.position = 0;
                ac = ba.readObject() as ArrayCollection;
                getPrefsByPrefIdsResult.token = prefsService.getPrefsByPrefIds(ac);   
            }

, как я уже говорилработает незначительно, только если я сохраню только одну закладку (идентификатор) для элемента, а затем перейду к списку закладок, детали для этой закладки будут успешно восстановлены, однако, если я сохраню более одной закладки (2 или более идентификаторов),страница не будет загружать детали, я не получаю сообщение об ошибке, но я считаю, что оно зависает, потому что оно ищет, скажем, идентификаторы «1,2» вместо «1» и «2», но я не знаю, почему это происходит или какрешить это.Я ценю совет, который мне дали, но мне трудно, нет никого, кто мог бы помочь мне с этой проблемой, и мне приходится проводить различные эксперименты с кодом.Может кто-нибудь, пожалуйста, помогите мне с этим, я был бы очень признателен :-) Спасибо

...