2012-03-22 133 views
1

我正在研究通过json/rest api从服务器检索sqlite数据库的iPhone应用程序。用户可以将行添加到本地表中,并可以在本地进行更新。现在,当我在本地数据库的表中添加了一些行时,我想从本地更新的数据库中仅将这些新行同步/插入服务器数据库。 如果有人知道该API方法(json/rest),请帮忙,或者如果有任何相关的教程,请帮助。如何通过json api更新服务器数据库上的数据?

回答

3

当你说你正在检索“sqlite”数据库时,你的意思是所有表及其行的“json”表示吗?我假设你实际上并没有发送“sqlite”数据库文件。

对于通过http发送和检索json,为简单起见,可以使用NSURLConnection和NSURLRequest,因为它们是内置的。如果要强制执行映射到核心数据,可以将RestKit框架用于连接和数据处理。

以下是前一种解决方案的示例实现 - 它假定您是ARC,否则您需要添加适当的保留和发布语句。

1)声明您使用的作为适当的委托

@interface ClassName : NSObject <NSURLConnectionDelegate> 

2)声明将用来接收数据

//interface 
    @property (nonatomic, strong) NSMutableData *responseData;  

    //implementation 
    @synthesize responseData; 

3 responseData对象)创建函数的类发送json请求

- (void)sendRequest 
{ 
    responseData = [NSMutableData data]; 

    //whatever your server address is 
    NSURL *url = [NSURL URLWithString:@"http://www.resturl.com/whatever"]; 

    //just sample data - create this dictionary with what you want to send 
    NSMutableDictionary *params = [[NSMutableDictionary alloc] init]; 
    [params setObject:@"SomeValue" forKey:@"SomeKey"]; 


    NSError *jsonError; 
    //NSJSONSerialization is Apple's new json serialization class so we can use it to convert to and from json and foundation objects 
    NSData *requestdata = [NSJSONSerialization dataWithJSONObject:params options:0 error:&jsonError]; 

    NSMutableURLRequest *request; 
    request = [NSMutableURLRequest requestWithURL:url]; 
    [request setHTTPMethod:@"POST"]; 
    [request setValue:[NSString stringWithFormat:@"%d", [requestdata length]] forHTTPHeaderField:@"Content-Length"]; 
    [request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
    [request setHTTPBody:requestdata]; 

    //this kicks off the request asynchronously 
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 

    //if you'd rather send a synchronous request, you can use the static NSURLConnection function 
    //sendSynchronousRequest:returningResponse:error: 
} 

4)实现委托功能接收我们的数据

//any time a piece of data is received we will append it to the responseData object 
    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
    { 
     [self.responseData appendData:data]; 
    } 

    //some sort of error, you can print the error or put in some other handling here, possibly even try again but you will risk an infinite loop then unless you impose some sort of limit 
    - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
    { 
     // Clear the activeDownload property to allow later attempts 
     self.responseData = nil; 

    } 

    //connection has finished, thse requestData object should contain the entirety of the response at this point 
    - (void)connectionDidFinishLoading:(NSURLConnection *)connection 
    { 
     NSError *jsonError; 
     NSDictionary *responseDict = 
     [NSJSONSerialization JSONObjectWithData:responseData 
             options:NSJSONWritingPrettyPrinted 
              error:&jsonError]; 
     if(responseDict) 
     { 
      NSLog(@"%@", responseDict); 
     } 
     else 
     { 
      NSLog(@"%@", [jsonError description]); 
     } 

     //clear out our response buffer for future requests 
     self.responseData = nil; 
    } 

如果要更新一些新的信息的远程数据库,只需跟踪新行的地方(而不是仅仅与完整数据集将它们合并),并发送包含只有那些行的新要求到将添加它们的端点。这是在不执行实际映射的情况下执行此操作的最简单方法。

相关问题