JSON к Персистентному Хранилищу данных (CoreData, и т.д.)

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

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

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

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

9
задан Community 23 May 2017 в 12:19
поделиться

1 ответ

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

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

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

Две хорошие структуры для преобразования между JSON и NS *: json-framework и 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 Data совпадают и что типы данных совпадают (т.е. номера JSON являются Core Data Номера NS и т. Д.). Приведенный выше код отлично работает даже при изменении модели.

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

15
ответ дан 4 December 2019 в 13:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: