0

我创建了几个 .asmx (.NET) 类型的 Web 服务,从本地 MySQL 数据库获取数据并将其显示为浏览器中的 XML。这已经启动并运行。

我想解析所说的 XML 并将其显示在我正在处理的 Android 应用程序中。由于 MySQL 数据库每个月只会更新几次,我认为每次我想在 Android 应用程序中显示数据时都不需要查询 Web 服务(以及 MySQL DB)。

我认为下载我的 Web 服务返回的 XML 并将其存储在 Android 文件系统中并从那里解析它是有意义的。这只是令人难以置信的倒退还是可行的?

当我访问我的本地 Web 服务方法之一时

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

它返回一个时间戳,指示数据库上次在浏览器中更改为 XML 的时间,但我不知道如何下载文件原始 XML 文件。

我可以这样做,还是应该以不同的方式进行?

欢迎任何建议。

4

1 回答 1

0

进行同步的一种简单方法是将上次更新的时间戳传递给服务器。然后,服务器要么给出一个空响应(无更新),要么给出自该时间戳以来更新的对象列表。在这两种情况下,它都会提供一个新的时间戳,因此客户端不必与服务器保持同步。

  1. 要求POST /WebService.asmx/GetUpdates

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

    如果该客户端没有先前的更新,则传递一个空的时间戳,或者将其忽略。设置UpdateNowFalse, 以查看是否有任何更新(<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,并将其写入SQLite 数据库。保存时间戳以备将来更新。


要向 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 回答