我创建了几个类型为.asmx(.NET)的Web服务,从本地MySQL数据库获取数据并在浏览器中将其显示为XML。这已经开始运行了。
我想解析所说的XML并将其显示在我正在处理的Android应用程序中。由于MySQL数据库每个月只会更新几次,所以每次我想在Android应用程序中显示数据时都不需要查询Web服务(以及MySQL数据库)。
我认为下载由我的Web服务返回的XML并将其存储在Android文件系统上并从那里解析它是有意义的。这只是令人难以置信的倒退还是可行的?
当我在
访问我的一个本地Web服务方法时http://localhost/../WebService.asmx/GetLastDBUpdate
它返回一个时间戳,指示数据库上次在浏览器中被更改为XML的时间,但我无法弄清楚如何下载文件原始XML文件。
我可以这样做,还是应该这样做?
欢迎任何建议。
答案 0 :(得分:0)
执行同步的一种简单方法是将上次更新的时间戳传递给服务器。然后,服务器提供空响应(无更新),或者自该时间戳以来更新的对象列表。在这两种情况下,它都会提供一个新的时间戳,因此客户端不必与服务器保持同步。
请求POST /WebService.asmx/GetUpdates
<GetUpdates>
<Timestamp>2012-07-19T13:42:13Z</Timestamp>
<UpdateNow>True</UpdateNow>
</GetUpdates>
如果该客户端没有先前的更新,则传递空时间戳,或将其保留。将UpdateNow
设置为False
,以查看是否有任何更新(<Objects>
将始终为空)。
响应
<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>
可以是请求的时间,也可以是最新更新的时间。
进程:解析XML,并将其写入SQLite database。保存时间戳以供将来更新。
要向网络服务提出实际请求,您可以使用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;
}