JSON для постоянного хранилища данных (CoreData и т. д.)

все данные в моем приложении извлекаются через API через JSON. Характер хорошего процента этих данных заключается в том, что он не меняется очень часто. Поэтому идти и делать запросы JSON, чтобы получить список данных, которые не сильно меняются, не казалось привлекательным.

Я ищу наиболее разумный вариант, чтобы этот JSON был сохранен на iPhone в каком-то постоянном хранилище данных. Очевидно, что одним из плюсов сохранения данных было бы предоставить его, когда телефон не может доступа к API.

Я посмотрел на немного примеры взаимодействия JSON и CoreData, например, но кажется, что они описывают только преобразование NSManagedObjects в JSON. Если Я ... --9-->can transform JSON в CoreData, моя единственная проблема будет в том, чтобы изменить эти данные, когда данные из API меняются.

(или, может, это все просто глупо.)

2 ответов


для некоторого концептуального чтения вы можете прочитать документацию о Эффективный Импорт Данных, особенно "найти или создать". см. предыдущий аналогичный вопрос.

получение JSON и сохранение его в качестве основных данных локально очень разумно. Как я это делаю в два этапа:

  1. преобразование JSON в собственные типы данных Cocoa (NSDictionary и NSArray)
  2. преобразование NS* в основной объект данных

два хорошие рамки для преобразования между JSON и NS* являются в JSON-структуры и TouchJSON. Приведенный ниже пример основан на JSON-framework.

предположим, вы получаете массив некоторых объектов из JSON. Вы бы тогда сделали:

NSArray *objects = [jsonStringYouGotFromServer JSONValue];
for (NSDictionary *_object in objects) {
    CDObjectType *cdObject = [self cdObjectFromDictionary:_object];
    // cdObject is now a full-featured Core Data object
}

cdObjectFromDictionary может быть что-то вроде этого:

- (CDObjectType *) cdObjectFromDictionary:(NSDictionary *)dict {

    CDObjectType *object = [NSEntityDescription
              insertNewObjectForEntityForName:@"Object"
              inManagedObjectContext:moc];

    NSDictionary *attributes = [[NSEntityDescription
        entityForName:@"Object"
        inManagedObjectContext:moc] attributesByName];

    for (NSString *attr in attributes) {            
        [object setValue:[dict valueForKey:attr] forKey:attr];                            
    }

    return object;
}

вышеизложенное предполагает, что имена атрибутов в вашей модели данных JSON и Core одинаковы и что типы данных совпадают (i.e JSON номера являются основными данными NSNumbers и т. д.). Приведенный выше код работает хорошо, даже если модель изменяется.

в приведенном выше коде не рассматривается, как проверить, существует ли объект локально, но вы можете представить, как это добавить. Необходимо иметь идентификатор объекта какой-либо формы в модели, и вы можете увидеть, существует ли объект локально перед его добавлением, или существующий объект должен быть обновлен.


  • аксессоры могут потребоваться, когда есть отношения to-many.
  • эффективнее использовать аксессоры, чем использовать key-value. (Внутренние данные ядра могут использовать key-value в любом случае, поэтому этот момент может быть неверным, если это так.)
  • используя подкласс и свойства, компилятор может помочь вам обнаружить проблемы, при использовании key-value проблемы будут отображаться только во время выполнения и сложнее исправить.

поэтому, также хорошо подкласс NSManagedObject и использовать сгенерированные свойства и методы доступа.