JSON для постоянного хранилища данных (CoreData и т. д.)
все данные в моем приложении извлекаются через API через JSON. Характер хорошего процента этих данных заключается в том, что он не меняется очень часто. Поэтому идти и делать запросы JSON, чтобы получить список данных, которые не сильно меняются, не казалось привлекательным.
Я ищу наиболее разумный вариант, чтобы этот JSON был сохранен на iPhone в каком-то постоянном хранилище данных. Очевидно, что одним из плюсов сохранения данных было бы предоставить его, когда телефон не может доступа к API.
Я посмотрел на немного примеры взаимодействия JSON и CoreData, например, но кажется, что они описывают только преобразование NSManagedObjects в JSON. Если Я ... --9-->can transform JSON в CoreData, моя единственная проблема будет в том, чтобы изменить эти данные, когда данные из API меняются.
(или, может, это все просто глупо.)
2 ответов
для некоторого концептуального чтения вы можете прочитать документацию о Эффективный Импорт Данных, особенно "найти или создать". см. предыдущий аналогичный вопрос.
получение JSON и сохранение его в качестве основных данных локально очень разумно. Как я это делаю в два этапа:
- преобразование JSON в собственные типы данных Cocoa (NSDictionary и NSArray)
- преобразование 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 и использовать сгенерированные свойства и методы доступа.