1

我目前正在使用 Flex 4.5.1 开发 Android 应用程序,但在尝试将存储在 SharedObject 数组中的数据传递给我的 Web 服务以进行数据库查询时遇到问题。下面的代码显示了我如何将数据存储在 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 Web 服务以运行 DB 查询。

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);          
            }

我已经在 Flex 中测试了 Web 服务,并将其配置为接收一个 Int 数组(int[]),并且当我使用两个虚拟值对其运行测试操作时它可以工作。但是,当我尝试使用上面的代码向 Web 服务传递共享对象数据时,我收到此错误:

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 属性,并想象在不同时间可以有多个书签集,例如在 Web 浏览器中。我能找到的唯一方法是将这些项目/详细信息存储在我检索的数组中,然后在保存回 LSO 并保存之前进行更新。

第二段代码与想象一个“书签页面”相关,其中包含我收藏的所有内容的列表。现在我想要发生的事情是,我将能够调用保存书签 ID 的 LSO 属性,然后以列表格式加载他们的详细信息。

我设法创建了 LSO 并将书签详细信息存储在其中,并允许更新它们并添加条目。此外,我确保我拥有的 PHP 代码拉回了与 id 数组相关的所有数据库对象,并且已经使用 flex 进行了测试。我似乎唯一不能做的就是将 id 传递给 PHP Web 服务文件。如果有帮助,Web 服务文件中的代码如下:

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 中的不同类型的对象。我已经设法让解决方案部分使用此代码:

此代码旨在捕获 boomark 信息并将其存储在 arrayCollection 中,然后将其传输到 bytesArray 并保存

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 bytesArray 中检索该信息并将其放回数组集合中

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);   
            }

但是,正如我所说,这仅以一种很小的方式起作用,就好像我只为一个项目存储一个书签(id)然后转到书签列表,成功检索到该书签的详细信息,但是如果我保存多个书签( 2 个或更多 id)页面不会加载详细信息,我没有收到错误消息,但我相信它挂起,因为它正在寻找说 id 的“1,2”而不是“1”和“2”,但我不知道为什么会这样或如何解决。我很感激我得到的建议,但我发现很难没有人可以帮助我解决这个问题,我不得不对代码进行各种实验。有人可以帮我解决这个问题吗,我将不胜感激:-)谢谢

4

0 回答 0