Я использую RestKit для захвата объектов из моей службы RoR и использую CoreData для сохранения некоторых объектов (больше объектов таблицы поиска статического типа). TasteTag — один из таких постоянных объектов:
#ifdef RESTKIT_GENERATE_SEED_DB
NSString *seedDatabaseName = nil;
NSString *databaseName = RKDefaultSeedDatabaseFileName;
#else
NSString *seedDatabaseName = RKDefaultSeedDatabaseFileName;
NSString *databaseName = @"Model.sqlite";
#endif
RKObjectManager* manager = [RKObjectManager objectManagerWithBaseURL:kServerURL];
manager.objectStore = [RKManagedObjectStore objectStoreWithStoreFilename:databaseName usingSeedDatabaseName:seedDatabaseName managedObjectModel:nil delegate:self];
.. lots of fun object mapping ..
RKManagedObjectMapping* tasteTagMapping = [RKManagedObjectMapping mappingForClass:[TasteTag class]];
[tasteTagMapping mapKeyPath:@"id" toAttribute:@"tasteTagID"];
[tasteTagMapping mapKeyPath:@"name" toAttribute:@"name"];
tasteTagMapping.primaryKeyAttribute = @"tasteTagID";
[[RKObjectManager sharedManager].mappingProvider setMapping:tasteTagMapping forKeyPath:@"taste_tags"];
[[RKObjectManager sharedManager].mappingProvider addObjectMapping:tasteTagMapping];
.. some more mapping ..
У меня есть данные, возвращаемые с сервера RoR, и они сопоставляются с объектами, как и ожидалось. Сущность Core Data также отображается нормально после того, как RestKit возвращает запрос:
"<TasteTag: 0x6e87170> (entity: TasteTag; id: 0x6e85d60 <x-coredata://03E4A20A-21F2-4A2D-92B4-C4424893D559/TasteTag/p5> ; data: <fault>)"
Проблема в том, что когда я пытаюсь получить доступ к свойствам объектов, ошибка не может показаться пожарной. Сначала я просто вызывал свойства, которые всегда возвращались как ноль (хотя это должно вызвать ошибку):
for (TasteTag *tag in self.vintage.tasteTags) {
[tagNames addObject:tag.name]; //get error of trying to add nil to array
}
После изучения ошибок ручного запуска (http://www.mlsite.net/blog/?p=518 ) Я попытался вызвать [tag willAccessValueForKey:nil]
, что приводит к:
Terminating app due to uncaught exception 'NSObjectInaccessibleException', reason: 'CoreData could not fulfill a fault for '0x6e7b060 <x-coredata://03E4A20A-21F2-4A2D-92B4-C4424893D559/TasteTag/p5>''
Поиск объекта в .sqlite на основе ключа (TasteTag/p5) показывает, что он сопоставлен с тем, который я ожидал.
В других сообщениях, касающихся RestKit, рекомендуется отключить кеш объектов (который я не использую), поскольку это обычно вызвано удалением объекта. Но на данном этапе я только читаю, а не удаляю, и у меня нет кеша на месте.
Если я просто вызову [TasteTag allObjects]
, я смогу вернуть все объекты обратно, и они загружаются без проблем. Это как раз в том случае, когда они виноваты кажется.