数据上传、下载

iMobile组件产品的数据上传、下载功能是基于SuperMap iServer Rest数据服务进行的。

本节将基于第一章中搭建的Changchun数据服务,本地数据源World.udb,详细讲述通过iMobile实现移动端与SuperMap iServer 服务端交互,进行数据上传、下载的详细流程。

第一步:准备本地数据源

-(void)downloadToLocal
{
   DataDownloadService *downloadService = [[DataDownloadService alloc]init];
   downloadService.downLoadDelegate = self;
   NSString *urlDataset = @"http://10.10.3.58:8090/iserver/services/data-world/rest/data/datasources/World/datasets/OceanLabelP_C.rjson";
   [downloadService downloadDatasetFrom:urlDataset toDatasource:m_datasource];
}

第二步:从服务端更新数据到本地数据集

当本地已经下载了需要的数据集,但服务端数据进行了修改(即服务端数据版本高于本地数据版本)时,可以通过更新数据的方式将服务端数据的变动更新到本地数据集中。注意,进行更新操作时服务端和本地都存在该名称的数据集及其对应的同步属性数据集。

第一步中我们已将Changchun数据服务中的矢量数据集School下载到了本地,这里我们假定我们下载数据后,服务端的数据集School进行了修改,那么我们就需要通过更新数据的方法将服务端的数据变动更新到本地。

更新数据实现方法:

-(void)updateToLocal
{
    DataDownloadService *downloadService = [[DataDownloadService alloc]init];
    downloadService.downLoadDelegate = self;
    NSString *urlDataset = @"http://192.168.19.157:8090/iserver/services/data-world/rest/data/datasources/World/datasets/OceanLabelP_C.rjson";
    [downloadService updateDatasetFrom:urlDataset toDatasetVector:(DatasetVector*)[[m_datasource datasets] getWithName:@"OceanLabelP_C"]];
}

第三步:修改更新/下载到本地的数据

通过第二步提供的方法更新数据到本地后,即可根据业务的具体需要对本地的数据进行修改。

注意:修改数据时不得通过DataUploadService类中提供的添加、修改、删除数据接口进行数据的修改,因为该类中提供的14个方法是直接对服务端的数据进行操作的,不支持版本管理功能。

本例中将对第二步中下载到本地的名称为School的矢量数据集,进行修改:

修改数据实现方法:

-(void)editData{
    BOOL f= YES;
    DatasetVector* dv = (DatasetVector*)[[m_datasource datasets] getWithName:@"OceanLabelP_C"]; 
    Recordset* rd = [dv recordset:NO cursorType:DYNAMIC];
    int x = arc4random()%7+1;
    [rd moveTo:x];
    [rd edit];
    //修改记录值
    [rd setFieldValueWithString:@"ChineseName" Obj:@"superMap"];
    [rd update];
    [rd dispose];
    if(f){
        NSLog(@"编辑成功(^ ^)");
        [self showInMap:(DatasetVector*)[m_datasource.datasets getWithName:@"OceanLabelP_C"]];
    } else {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"编辑失败!" message:nil delegate:self cancelButtonTitle:@"确认" otherButtonTitles:nil,nil];
        [alert show];
        NSLog(@"编辑失败!");
	}
}

第四步:向服务端提交数据

按照业务需要完成本地数据的修改后,即可将修改后的数据提交到服务端。提交数据时需注意两点:1)提交时要求服务器端和本地都存在该数据集及对应的同步属性数据集。2)提交时本地数据集的版本不得高于服务端版本(即本地的Max[SmUserID]不大于服务器上的Max[SMID])。

本例中,示范如何将第三步中修改的School数据集提交至服务端:

-(void)uploadToService
{
    NSString *urlDataset = @"http://192.168.19.157:8090/iserver/services/data-world/rest/data/datasources/World/datasets/OceanLabelP_C.rjson";
    DataUploadService *dataUploadService = [[DataUploadService alloc]init];
    dataUploadService.uploadDelegate = self;
    //提交拷贝并修改的数据集
    [dataUploadService commitDatasetFrom:(DatasetVector*)[[m_datasource datasets] getWithName:@"OceanLabelP_C"] toDatasetURL:urlDataset];
}