将nsmutable数组数据传递给NSURLRequest:发布数据IOS7

时间:2014-03-19 10:05:35

标签: ios iphone sqlite nsmutableurlrequest

您好,在我的应用程序中,我已将数据存储在我的本地数据库sqlite3中。现在我必须将数据从本地数据库sqlite3上传到在线服务器。为了检索数据,我使用dataDictionary从sqlite3数据库中获取所有数据。

在我的h文件中,我有我的网址将数据插入到我的在线服务器中。

  #define kPostURL @"url"
  #define Kname @"name"
  #define kphone @"phone"
  #define karea @"area"
  #define kcity @"city"

在下面的代码中,我已将所有数据存储在数据字典中,并且已将数据存储到名为array的nsmutable数组中。如果我在日志中打印数组它显示所有数据。现在的问题是如何使用post方法将这个可移动数据传递到在线服务器。

   NSMutableArray *array = [[NSMutableArray alloc] init];
   entries = [[NSMutableArray alloc] init];
   [self openDB];
   NSString *sql = [NSString stringWithFormat:@"SELECT * FROM reg"];
   const char *query_stmt = [sql UTF8String];
   sqlite3_stmt *statement;

  if (sqlite3_prepare_v2(db, query_stmt, -1, &statement, nil)==SQLITE_OK) {
     while (sqlite3_step(statement)==SQLITE_ROW) {

        NSMutableDictionary *_dataDictionary=[[NSMutableDictionary alloc] init];

        NSString *date = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 0)];
        field1Str= date;

        NSString *customer = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 1)];
        field2Str = customer;

        NSString *code1 = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 2)];
        field3Str = code1;

        NSString *code2 = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement,3)];
        field4Str = code2;

        //NSString *str = [[NSString alloc]initWithFormat:@"%@ - %@ - %@ - %@",field1Str,field2Str,field3Str,field4Str];
        //[entries addObject:str];

        [_dataDictionary setObject:[NSString stringWithFormat:@"%@",field1Str] forKey:@"Kname"];
        [_dataDictionary setObject:[NSString stringWithFormat:@"%@",field2Str] forKey:@"kphone"];
        [_dataDictionary setObject:[NSString stringWithFormat:@"%@",field3Str] forKey:@"karea"];
        [_dataDictionary setObject:[NSString stringWithFormat:@"%@",field4Str] forKey:@"kcity"];

        [array addObject:_dataDictionary];

在下面的代码中,我使用post方法将数据传递给数据已在.m文件中声明的在线服务器,但我不知道如何在post方法中使用nsmutablearray。

  -(void) withName:(NSString *) na phone:(NSString *) ph are:(NSString *) arr cit:(NSString *) citt {


     if (na!= nil && ph != nil && arr != nil && citt != nil ) {

      NSMutableString *postString = [NSMutableString stringWithString:kPostURL];

      [postString appendString:[NSString stringWithFormat:@"?%@=%@", Kname,na]];
      [postString appendString:[NSString stringWithFormat:@"&%@=%@", kphone,ph]];
      [postString appendString:[NSString stringWithFormat:@"&%@=%@", karea,arr]];
      [postString appendString:[NSString stringWithFormat:@"&%@=%@", kcity,citt]];



      [postString setString:[postString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

      NSMutableURLRequest *request =[[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:postString]];
      [request setHTTPMethod:@"POST"];

      postConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];

    }
   }

在上面的代码中,我通过点击按钮传递数据。请告诉我如何让它长时间卡在我的头上。请给我一些解决方案。

   - (IBAction)send:(id)sender {
      [self withName:field1Str phone:field2Str are:field3Str cit:field4Str];
     }

感谢。

2 个答案:

答案 0 :(得分:1)

这取决于服务器接受的URL格式。

最简单的答案,但也是最糟糕的答案(不太适合未来),如果服务器支持它,则使用类似:?kname[0]=x&kname[1]=y的URL来传递两个条目。

但是,如果您想同时发布大量数据,我建议您使用请求正文,而不是网址,因为您很快就会达到最大网址长度。

因此,您应首先将服务器设计为接受一组记录,然后使用客户端服务器端定义的格式。通常,一个好的解决方案是使用NSJSONSerialization在客户端序列化字典数组,将JSON字符串设置为请求的正文,并解析JSON服务器端。

此外,您应该在将每个字符串添加到URL之前对其进行转义。否则你将如何在&和分离你的领域和任何&出现在你的琴弦中?

答案 1 :(得分:0)

您必须先了解您的网络服务所需的参数。要将数据发送到服务器,您可以根据数组内容创建XML结构并将其传递给webservice参数。 您可以创建如下所示的XMl

<record>
<name>value</name>
<city>value</city>
.
.
</record>

并重复记录所需时间的数量。