0

这是我第一次将应用程序连接到网络,我只是想确保我清楚它是如何工作的。我想从在线托管的 mysql 数据库下载数据,它似乎也附加了 php(hostgator)是主机。

所以步骤是: 1. 在 php(在服务器模块上)中,使用附加的 PHP 模块设置一个将 mysql 信息转录为 JSON 的方法。返回一个数组(我认为json是一个多层字典数组对象)

  1. 在 xcode 中,使用苹果的 json 框架创建一个 url 请求,并将数据下载到一个 json 对象(或数组或字典?

  2. 浏览数据并创建对象并保存到 coredata。

如果我正确地遵循逻辑,请告诉我。

JSON 也返回 1 个对象或 mysql 数据库上的所有对象。因此,如果我需要在 coredata 上输入 10,000 个对象,我必须发出 10,000 个请求或一个请求并解析 10,000 个对象的信息价值?

这也是做我需要做的最好的方法吗?我听说过http请求,但它看起来很复杂,我不知道它是什么。

对不起,这样的菜鸟问题。

谢谢您的帮助。

4

2 回答 2

3

有很多方法可以做到这一点,有些方法比其他方法“更正确”:-) 但你走对了。我解释了在类似情况下我会做什么:

1- 对于 PHP 引擎,您应该创建一个 API 来访问您的数据。哪些数据?最简单的,可能是您可以做的第一件事 TO TEST(仅用于测试目的!!!!)是创建一个页面,该页面通过 POST 从您的 ios APP 接收查询并使用编码的 JSON 字符串进行回答。使用 JSON,您可以传输对象的整个层次结构:变量、数组、字典……由您决定如何将对象链接在一起。如果您要编码的数据是一个表格,您可以执行类似的操作:

// first connect to the database and execute the query, then...

$data = array();
while(!$RS->EOF){
for ($i = 0; $i < $cols; $i++){
    $rowName = utf8_encode($RS->Fields[$i]->name);
    $rowValue = utf8_encode($RS->Fields[$i]->value);
    $rowData[$rowName] = $rowValue;
}

array_push($data, $rowData);
$RS->MoveNext();
}

$response['data'] = $data;
echo json_encode($response);

结果是一个 JSON 对象,其中包含一个名为“data”的键的第一个字典。在“data”键里面有一个字典数组。每个字典都有键的列名和数据的列值:

data =     (
            {
        attivita = "this is the first row in the table";
        id = 2548;
        },
            {
        attivita = "this is the second row in the table";
        id = 2547;
        };
}

您可以简单地使用 json_encode 来创建您的 json 字符串。

在 iPhone 端,我建议你下载并使用 AFNetworking。这是一个非常好的和完整的开源框架,有很多用于 http/https 请求、XML、JSON ecc 的内置对象和方法......使用 AFNetworking 你可以用类似的方式发出请求:

AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:@"http://url.for.the.php.page"];
NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" path:mainPath parameters:params];


AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {

    // your success code here

    // remember, the first object is a dictionary with a key called data
    NSArray *arrayOfData = [JSON objectForKey:@"data"];

    NSMutableArray *arrayOfActivities = [NSMutableArray array];

    for (NSDictionary *objectDictionary in arrayOfData) {
        // objectDictionary is your dictionary containing 
        // a key with the column name and a value with the column content
        // here you can init your custom objects

    }


} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
    // your failure code here
}];

[operation start];

如您所见,JSONRequestOperationWithRequest: 方法有一个完成处理程序返回解码后的 JSON,因此您可以使用 objectForKey 或 objectAtIndex 直接访问您的字典/数组;-)

最后的建议:在生产和安全环境中,您应该避免通过发布请求发送查询。我在此处粘贴的代码用于私人应用程序(仅供我用于测试目的)。最好为每种请求使用不同的 API 和安全的身份验证方法(查看 oAuth)。我建议你看一下 Instagram 或 Twitter API(Instagram 更简单),尝试使用它。他们会给你一些关于如何创建自己的 API 的想法。

祝你好运

于 2013-01-03T21:05:07.247 回答
2

创建返回 JSON 化 MySQL 数据的方法的第一步是正确的。然而,究竟返回什么,完全取决于你!您会发现 JSON 是一种极其灵活的格式,它允许您在响应中放入几乎任何格式的数据。根据您想要做什么,在您的 PHP 模块中有几个返回不同内容的方法可能是有意义的。例如,如果您有一个书籍数据库,也许您想创建一个允许您指定作者的方法,并返回一个 JSON 响应,其中包含该作者编写的数据库中的所有书籍。

您可以使用 HttpRequest 来实际执行对您的模块的调用,但我发现 Obj-CNSURLRequest非常易于使用:

NSURLRequest *request = [NSURLRequest requestWithURL:
                        [NSURL URLWithString:@"http://yoururl/books/38917"]];
[[NSURLConnection alloc] initWithRequest:request delegate:self];

不要认为您必须手动将 JSON 响应解析为您自己的 Objective-C 对象;这是一项非常常见的任务,并且有许多很棒的库可以做到这一点。查看有关 SBJSON 框架的本教程以查看最流行的解决方案之一。

例如,以下是如何将 JSON 响应解析NSDictionary为便于遍历的方法:

// Create SBJSON object to parse JSON
SBJSON *parser = [[SBJSON alloc] init];

// parse the JSON string into an object - assuming json_string is a NSString of JSON data
NSDictionary *object = [parser objectWithString:json_string error:nil];
于 2013-01-03T20:51:08.503 回答