数据服务

iMobile支持与iServer进行数据交互,下载服务器端的数据到移动设备,将移动端采集或或编辑的数据上传到服务器。数据服务需要使用的类库和关键方法,如下表所示:

jar包
com.supermap.data.jar、com.supermap.mapping.jar、com.supermap.services.jar、gson.jar、okhttp.jar、okio.jar
so库
libimb2d.so、libgnustl_shared.so、libQt5Core.so、libQt5Gui.so、libQt5Svg.so、libQt5Widgets.so(v11.1版本开始,需添加后五个so库。)
关键类和方法
DataDownloadService:downloadDataset()、updateDataset()
DataUploadService:commitDataset()

上传数据

上传数据,是将移动端数据集中的记录,上传到服务端,更新服务端数据的过程。工作时,按照业务需要完成本地数据的修改后,即可将修改后的数据提交到服务端。

提交数据时需注意两点:

(1)提交时要求服务器端和本地都存在该数据集及对应的同步属性数据集。

(2)提交时本地数据集的版本不得高于服务端版本(即本地的Max[SmUserID]不大于服务器上的Max[SMID])。

参考代码如下:

if(m_datasource != null){
  DatasetVector dataset = (DatasetVector)m_datasource.getDatasets().get(datasetName);
  String urlDataset = mUrlDatasets + datasetName;
  DataUploadService uploadService = new DataUploadService(urlServer);
  uploadService.setResponseCallback(new ResponseCallback(){
    @Override
    public void requestFailed(String errorMsg) {
      Toast.makeText(m_Activity, "上传失败", Toast.LENGTH_SHORT).show();
    }
    @Override
    public void requestSuccess() {
    }
    @Override
    public void receiveResponse(FeatureSet result) {				
    }
    @Override
    public void dataServiceFinished(String arg0) {
      Toast.makeText(m_Activity, "上传成功", Toast.LENGTH_SHORT).show();
      m_mapControl.getMap().refresh();
	}
    @Override
    public void addFeatureSuccess(int arg0) {				
    }
  });		
  uploadService.commitDataset(urlDataset, dataset);

下载数据

当本地没有数据,或者本地数据较旧的时候,可以从服务端下载数据到移动端。下载数据前,先在本地打开对应的数据,参考代码如下:

/** ————关联工作空间———— **/
m_workspace = new Workspace();
m_mapView = (MapView) findViewById(R.id.Map_view);
m_mapControl = m_mapView.getMapControl();
m_map = m_mapControl.getMap();
m_map.setWorkspace(workspace);
/** ————打开数据源———— **/
DatasourceConnectionInfo info = new DatasourceConnectionInfo();
info.setEngineType(EngineType.UDB);
info.setServer(sdcard + "/SampleData/GeometryInfo/World.udb");
m_datasource = workspace.getDatasources().open(info);
/** ————打开数据集———— **/
if(m_datasource != null){       
  m_map.getLayers().add(m_datasource.getDatasets().get(0), true);
  m_map.refresh();
}

从服务端下载数据

当本地没有数据时,从服务端下载需要的数据集到本地数据源中。进行下载操作时,会在本地和服务器端分别创建一个以“被下载数据集名称”+“_Table”命名的同步属性数据集,用于记录所下载数据集在本地修改情况。

参考代码如下:

if(m_datasource != null){
  m_datasource.getDatasets().delete("Lakes_Table");
  m_datasource.getDatasets().delete("Lakes");
	
  String urlDataset = mUrlDatasets + datasetName;
  DataDownloadService downloadService = new DataDownloadService(urlServer);
  downloadService.setResponseCallback(new ResponseCallback(){
    @Override
    public void requestFailed(String errorMsg) {
      Toast.makeText(m_Activity, "下载失败", Toast.LENGTH_SHORT).show();
    }
    @Override
    public void requestSuccess() {
	}
    @Override
    public void receiveResponse(FeatureSet result) {	
	}
    @Override
    public void dataServiceFinished(String arg0) {
      Toast.makeText(m_Activity, "下载成功", Toast.LENGTH_SHORT).show();
      m_mapControl.getMap().refresh();
    }
    @Override
    public void addFeatureSuccess(int arg0) {				
    }
  });
  downloadService.downloadDataset(urlDataset, m_datasource);

从服务端更新数据到本地数据集

当本地已经下载需要的数据集,但服务端数据进行修改(即服务端数据版本高于本地数据版本)时,可以通过更新数据的方式将服务端数据的变动更新到本地数据集中。

更新数据需要注意:进行更新操作时服务端和本地都存在该名称的数据集及其对应的同步属性数据集。

参考代码如下:

if(m_datasource != null){
  String urlDataset = mUrlDatasets + datasetName;
  DataDownloadService downloadService = new DataDownloadService(urlServer);
  downloadService.setResponseCallback(new ResponseCallback(){
    @Override
    public void requestFailed(String errorMsg) {
      Toast.makeText(m_Activity, "更新失败", Toast.LENGTH_SHORT).show();
    }
    @Override
    public void requestSuccess() {
	}
    @Override
    public void receiveResponse(FeatureSet result) {
	}
	@Override
	public void dataServiceFinished(String arg0) {
      Toast.makeText(m_Activity, "更新成功", Toast.LENGTH_SHORT).show();
	}
    @Override
    public void addFeatureSuccess(int arg0) {				
	}
  });
  downloadService.updateDataset(urlDataset, (DatasetVector)m_datasource.getDatasets().get(datasetName));

上述数据服务功能,可参照示例代码:范例程序说明/Service/数据服务访问