繁体   English   中英

从PHP / MySQL / JSON到iOS / Objective-C / SQLite

[英]From PHP/MySQL/JSON to iOS/Objective-C/SQLite

我正在尝试创建一个iOS应用程序,在加载时,最初将通过HTTP连接回PHP Web服务,该服务将从MySQL数据库输出数据作为JSON。 然后,我希望它将此数据导入iOS应用程序中的本地SQLite数据库。 我已经下载了Objective-C的JSON-Framework。

我的问题是双重的。

1)从PHP输出JSON的最佳方法是什么,以便我可以在同一个JSON文件中发送多个数据库表? 我有4个数据表,我正在尝试发送(用户,建筑物,房间,设备)。 以下是我当前输出JSON数据的方式:

    // Users
    $query = "SELECT * from user";
    $result = mysql_query($query,$conn) or die('Errant query:  '.$query);

    $users = array();
    if(mysql_num_rows($result)) {
      while($user = mysql_fetch_assoc($result)) {
      $users[] = array('user'=>$user);
      }
    }

    // Buildings
    $query = "SELECT * from building";
    $result = mysql_query($query,$conn) or die('Errant query:  '.$query);

    $buildings = array();
    if(mysql_num_rows($result)) {
      while($building = mysql_fetch_assoc($result)) {
       $buildings[] = array('building'=>$building);
     }
    }

    // Rooms
    $query = "SELECT * from room";
    $result = mysql_query($query,$conn) or die('Errant query:  '.$query);

    $rooms = array();
    if(mysql_num_rows($result)) {
     while($room = mysql_fetch_assoc($result)) {
      $rooms[] = array('room'=>$room);
     }
    }

    // Devices
    $query = "SELECT * from device";
    $result = mysql_query($query,$conn) or die('Errant query:  '.$query);

    $devices = array();
    if(mysql_num_rows($result)) {
     while($device = mysql_fetch_assoc($result)) {
      $devices[] = array('device'=>$device);
     }
    }

    header('Content-type: application/json');
    echo json_encode(array('users'=>$users));
    echo json_encode(array('buildings'=>$buildings));
    echo json_encode(array('rooms'=>$rooms));
    echo json_encode(array('devices'=>$devices)); 

我担心这种方法不是发送多个对象的正确方法。

2)在iOS应用程序中,如何自动获取此JSON数据并将其插入SQLite中相应的本地数据库表?

谢谢你的帮助。

在1.而不是JSOn你可以使用二进制属性列表,它们在iPhone上原生实现,并且有一个库将PHP转换为二进制Plist https://github.com/rodneyrehm/CFPropertyList

使用二进制属性列表有很多好处,它们可能是JSON大小的1/5,您不需要外部库来解析它们,因此所有代码都更简单,等等。

On 2.没有简单的方法来获取JSON / Plist结构并将其插入SQL数据库,因为JSON / Plist比SQL表具有更大的灵活性。 因此,您必须首先在SQLite DB中创建正确的表,然后使用普通的INSERT将数据逐个插入到数据库中,就像使用PHP一样。

是的卢克的建议是好的,但你对出口表的方式会很好。 你可能只需要深入挖掘结构以获得你想要的东西 - 即你的输出返回一个“数组字典词典”,然后它将包含每个表的数据。

至于先下载它们:

1)NSURLConnection及其委托方法 - 您可以向您的网络服务器发送异步请求以获取此文件,并在下载数据时收到通知,因此用户界面永远不会在您的应用中被阻止。

以下是来自Apple的一些优秀示例的文档: http//developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html

在下载结束时,您将拥有一个NSData对象,然后可以使用NSString *jsonContents = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding将其转换回字符串。

然后,您可以使用JSON解析器库 - 我建议使用SBJSON https://github.com/stig/json-framework - 它将解析数据并将其作为字典或数组返回,具体取决于您的结构。

从那里你可以使用字典中的valueForKey或者数组中的objectAtIndex:来访问你的表和值,然后将它映射到你选择的本地存储中,我推荐使用Coredata(或者如果你熟悉它也可以使用sqlite)。

希望能帮助到你。 ROG

我不能说2),但对于1),我建议将你的JSON组合成一个数组。 JSON(和数组)的一个好处是可以根据需要嵌套元素。

echo json_encode(array(
    'users'=>$users,
    'buildings'=>$buildings,
    'rooms'=>$rooms,
    'devices'=>$devices,
)); 

如何在Web服务器上准备SQLite数据库并将其下载到iOS应用程序? 这样,你就可以在PHP端完成繁重的任务。 如果数据是相对静态的,您甚至可以设置计划任务以定期生成SQLite数据库。

我们已经为我们的一个应用程序完成了这项工作,并且它运行良好。

要记住的一件事是,您应该在Web服务器上启用gzip压缩以最小化数据传输。 请记住,你必须做一些额外的东西来使用NSURLConnection进行gzip压缩:

http://www.bigevilempire.com/codelog/entry/nsurlconnection-with-gzip/

您可以使用REST服务器和RESTKit。

如果您想要一个功能更全面的独立解析库提供的解决方案,您可能需要查看RestKit: http: //restkit.org/

该框架包含了获取,解析和将JSON有效负载映射到对象的操作。 它可以处理深层嵌套结构,并可以直接映射回Core Data以实现持久性。

在较高的层次上,这是您在RestKit中的fetch和post操作的感觉:

- (void)loadObjects {
  [[RKObjectManager sharedManager] loadObjectsAtResourcePath:[@"/path/to/stuff.json" delegate:self];
}

- (void)objectLoader:(RKObjectLoader*)loader didLoadObjects:(NSArray*)objects {
  NSLog(@"These are my JSON decoded, mapped objects: %@", objects);

  // Mutate and PUT the changes back to the server
  MyObject* anObject = [objects objectAtIndex:0];
  anObject.name = @"This is the new name!";
  [[RKObjectManager sharedManager] putObject:anObject delegate:self];
}

该框架负责后台线程上的JSON解析/编码,让您声明JSON中的属性如何映射到对象的属性。 社区中的许多人正在使用PHP后端+ RestKit取得巨大成功。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM