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[] ) を受け取るように構成しました。2 つのダミー値を使用してテスト操作を実行すると動作します。ただし、上記のコードを使用して 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 に保存して保存することでした。

2 番目のコードは、ブックマークしたすべてのコンテンツのリストを含む「ブックマーク ページ」を想像することに関連しています。ここで私が望んでいたのは、ブックマークの 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 に格納できるさまざまな種類のオブジェクトを試していたので、私は自分自身でさらに進歩しました。私はこのコードでソリューション部分を動作させることができました:

このコードは、bomark 情報を取得して 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) を 1 つだけ保存してブックマーク リストに移動すると、そのブックマークの詳細が正常に取得されますが、複数のブックマークを保存すると ( 2 つ以上の ID) ページは詳細をロードしません。エラーは発生しませんが、「1」と「2」ではなく ID の「1,2」を探しているため、ハングしていると思いますが、わかりませんこれがなぜなのか、またはこれを解決する方法。与えられたアドバイスに感謝しますが、この問題について私を助けることができる人がいないのは難しいと感じており、コードでさまざまな実験を行う必要があります. 誰かがこれで私を助けてくれますか?本当に感謝します:-)ありがとう

4

0 に答える 0