0

ローカルの MySQL データベースからデータを取得し、ブラウザーに XML として表示する .asmx (.NET) タイプの Web サービスをいくつか作成しました。これはすでに稼働しています。

上記の XML を解析し、作業中の Android アプリケーションに表示したいと考えています。MySQL データベースは毎月数回しか更新されないため、Android アプリケーションでデータを表示するたびに Web サービス (およびその結果として MySQL DB) にクエリを実行する必要はありません。

Web サービスから返された XML をダウンロードして Android ファイル システムに保存し、そこから解析するのが理にかなっていると考えました。これは信じられないほど後退しているだけですか、それとも実行可能ですか?

でローカル Web サービス メソッドの 1 つにアクセスすると、

http://localhost/../WebService.asmx/GetLastDBUpdate

データベースがブラウザで XML として最後に変更された日時を示すタイムスタンプを返しますが、生の XML ファイルをダウンロードする方法がわかりません。

これを行うことができますか、それとも別の方法で行う必要がありますか?

どんな提案でも大歓迎です。

4

1 に答える 1

0

同期を行う簡単な方法の 1 つは、最後の更新のタイムスタンプをサーバーに渡すことです。その後、サーバーは空の応答 (更新なし) を返すか、そのタイムスタンプ以降に更新されたオブジェクトのリストを返します。どちらの場合も、新しいタイムスタンプが提供されるため、クライアントはサーバーとの同期を維持する必要はありません。

  1. リクエストPOST /WebService.asmx/GetUpdates

    <GetUpdates>
        <Timestamp>2012-07-19T13:42:13Z</Timestamp>
        <UpdateNow>True</UpdateNow>
    </GetUpdates>
    

    そのクライアントからの以前の更新がない場合は、空のタイムスタンプを渡すか、省略します。に設定UpdateNowするとFalse、更新があるかどうかを確認できます (<Objects>常に空になります)。

  2. 応答

    <Updates>
        <Timestamp>2012-07-23T17:54:13Z</Timestamp>
        <Count>23</Count>
        <Objects>
            <Object>...</Object>
            <Object>...</Object>
            ...
        </Objects>
    </Updates>
    

    また

    <Updates>
        <Timestamp>2012-07-19T13:42:13Z</Timestamp>
        <Count>0</Count>
        <Objects/>
    </Updates>
    

    リクエストの時刻、または最新の更新時刻の<Timestamp>いずれかです。

  3. プロセス: XML を解析し、S​​QLite データベースに書き込みます。今後の更新のためにタイムスタンプを保存します。


Web サービスに実際のリクエストを行うには、kSoap2 for Androidを使用できます。

public SoapObject GetUpdates(String timestamp, boolean updateNow) {
    SoapObject request = new SoapObject("http://tempuri.org/", "GetUpdates");
    request.addProperty("Timestamp", timestmap);
    request.addProperty("UpdateNow", updateNow ? "True" : "False");

    SoapSerializationEnvelope envelope =
            new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.setOutputSoapObject(request);

    HttpTransportSE transport = new HttpTransportSE(
            "http://www.example.com/WebService.asmx/GetUpdates");
    transport.call("GetUpdates", envelope);

    return (SoapObject) transport.bodyIn;
}
于 2012-07-23T18:03:17.830 に答える