[英]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.