如何通过json api更新服务器db上的数据? [英] How to update data on server db through json api?

查看:101
本文介绍了如何通过json api更新服务器db上的数据?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

i'm working on an iPhone application which retrieve sqlite database from server through json/rest api. And user can add rows to its tables locally and can update it locally. Now, as i added some rows to tables in local database, i want to sync/insert only those new rows to server database from my local updated db. Please help if somebody knows about that api method(json/rest) or If there is any tutorial related to it please help.

推荐答案

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

When you say you are retrieving the "sqlite" database, do you mean a "json" representation of all the tables and their rows? I'm assuming you're not actually sending the "sqlite" db file.

为了通过http发送和检索json,你可以使用NSURLConnection和NSURLRequest来简化,因为它们如果你想强制映射到核心数据,你可以使用RestKit框架进行连接和数据处理。

For sending and retrieving json via http you can use NSURLConnection and NSURLRequest for simplicity, because they are built in. If you want to enforce a mapping to core data, you can use the RestKit framework for both the connection and data handling.

这是一个示例实现前一个解决方案 - 它假定你是ARC,否则你需要添加适当的retain和release语句。

Here is an example implementation of the former solution - it assumes you are ARC, you will need to add the appropriate retain and release statements otherwise.

1)声明你正在使用的类是合适的委托

1) declare the class you're using as the appropriate delegate

    @interface ClassName : NSObject <NSURLConnectionDelegate>

2)声明将用于接收数据的responseData对象

2) declare a responseData object that will be used to receive data

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

    //implementation
    @synthesize responseData;

3)创建发送json请求的函数

3) create the function that sends the json request

    - (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)实施委托函数以接收我们的数据

4)implement the delegate functions to receive our data

//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;
    }

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

If you want to update the remote database with some new information, just keep track of the new rows locally (rather than just merging them with the full dataset) and send a new request containing only those rows to an endpoint that will add them. That is the simplest way to do this without enforcing an actual mapping.

这篇关于如何通过json api更新服务器db上的数据?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆