От PHP / MySQL / JSON до iOS / Objective-C / SQLite - PullRequest
4 голосов
/ 21 февраля 2011

Я пытаюсь создать приложение для iOS, которое после загрузки первоначально подключится через HTTP обратно к веб-сервису PHP, который будет выводить данные в виде JSON из базы данных MySQL. Затем я хотел бы импортировать эти данные в локальную базу данных SQLite в приложении iOS. Я уже скачал JSON-Framework для Objective-C.

У меня вопрос в два раза.

1) Каков наилучший способ вывода JSON из PHP, чтобы я мог отправлять несколько таблиц базы данных в одном файле 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?

Спасибо за любую помощь.

Ответы [ 6 ]

4 голосов
/ 21 февраля 2011

Вкл. 1. Вместо JSOn вы можете использовать двоичные списки свойств, которые изначально реализованы на iPhone, и есть библиотека для преобразования PHP в бинарный Plist https://github.com/rodneyrehm/CFPropertyList

Существует много преимуществ использования списков двоичных свойств, они, вероятно, составляют 1/5 от размера JSON, вам не нужна внешняя библиотека для их анализа, поэтому весь код намного проще и т. Д.

On 2. Нет простого способа взять структуру JSON / Plist и вставить ее в базу данных SQL, поскольку JSON / Plist обеспечивает гораздо большую гибкость, чем таблицы SQL. Поэтому вам сначала нужно создать правильные таблицы в вашей базе данных SQLite, а затем использовать обычный INSERT для вставки данных один за другим в базу данных точно так же, как вы это делаете с PHP.

3 голосов
/ 21 февраля 2011

Да, рекомендация Люка хороша, но вы будете в порядке с тем, как вы экспортируете свои таблицы. Возможно, вам просто придется «углубиться» в структуру, чтобы получить то, что вы хотите - то есть, ваш вывод с возвратом «словаря словарей массивов», который затем будет содержать данные для каждой таблицы.

Что касается их первой загрузки:

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, если вы знакомы с это тоже).

Надеюсь, это поможет. Рог

2 голосов
/ 21 февраля 2011

Как насчет подготовки базы данных SQLite на веб-сервере и загрузки ее в приложение iOS?Таким образом, вы делаете тяжелую работу на стороне PHP.Если данные относительно статичны, вы даже можете настроить запланированное задание на регулярное создание базы данных SQLite.

Мы сделали это для одного из наших приложений, и оно работало очень хорошо.

Следует помнить одну вещь: вам следует включить сжатие gzip на веб-сервере, чтобы минимизировать передачу данных.Помните, что вы должны сделать некоторые дополнительные вещи, чтобы использовать сжатие gzip с NSURLConnection:

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

2 голосов
/ 21 февраля 2011

Я не могу говорить с 2), но для 1) я бы порекомендовал объединить ваш JSON в один массив. Одна из приятных особенностей JSON (и массивов) - возможность вкладывать элементы настолько глубоко, насколько вам нравится.

echo json_encode(array(
    'users'=>$users,
    'buildings'=>$buildings,
    'rooms'=>$rooms,
    'devices'=>$devices,
)); 
1 голос
/ 27 ноября 2012

вы можете использовать REST-сервер и RESTKit.

0 голосов
/ 24 февраля 2011

Если вы хотите более полнофункциональное решение, чем то, что предлагает автономная библиотека для разбора, вы можете взглянуть на RestKit: http://restkit.org/

Фреймворк оборачивает операции извлечения, анализа и отображения полезных нагрузок JSON в объекты. Он может работать с глубоко вложенными структурами и может напрямую связываться с Базовыми данными для сохранения.

На высоком уровне, вот как будут выглядеть ваши операции извлечения и публикации в RestKit:

- (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 с большим успехом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...