Я работал с RestKit (0.9.3), чтобы заполнить некоторые базовые данные в моем приложении. Объекты сущности созданы правильно, но отношения между ними не созданы. Из того, что я могу сказать, у меня все настроено правильно в соответствии с:
- https://github.com/RestKit/RestKit/wiki/Object-mapping
- RKRelationshipMappingExample в папке примеров
Итак, вот пример JSON, который я получаю с сервера:
{
"artist" : {
"artistId" : 123,
"artistName" : "The Artist",
"albums" : [
{
"albumPrice" : 12.99,
"albumId" : 456,
"trackCount" : 12,
"albumName" : "Album Title",
},
{
"albumPrice" : 10.99,
"albumId" : 789,
"trackCount" : 10,
"albumName" : "Another Album Title",
}
]
}
}
И я использую RestKit для заполнения следующих двух управляемых объектов:
@interface Artist : NSManagedObject
@property (nonatomic, retain) NSNumber * artistId;
@property (nonatomic, retain) NSString * artistName;
@property (nonatomic, retain) NSSet *albums;
@end
@interface Artist (CoreDataGeneratedAccessors)
- (void)addAlbumsObject:(Album *)value;
- (void)removeAlbumsObject:(Album *)value;
- (void)addAlbums:(NSSet *)values;
- (void)removeAlbums:(NSSet *)values;
@end
@interface Album : NSManagedObject
@property (nonatomic, retain) NSNumber * albumId;
@property (nonatomic, retain) NSString * albumName;
@property (nonatomic, retain) NSNumber * albumPrice;
@property (nonatomic, retain) NSNumber * trackCount;
@property (nonatomic, retain) NSManagedObject *artist;
@end
Я установил следующие конфигурации с помощью RestKit, и предполагается, что будут созданы 3 элемента Core Data: один исполнитель и два альбома. У сущности исполнителя есть отношение "альбомы", которое должно быть набором этих двух альбомов.
// Initialize our RestKit singleton
RKClient *client = [RKClient clientWithBaseURL:API_URL];
// Initialize for Object mapping
RKObjectManager* objectManager = [RKObjectManager objectManagerWithBaseURL:API_URL];
objectManager.objectStore = [RKManagedObjectStore objectStoreWithStoreFilename:@"AppName.sqlite"];
// Configure ALBUM mapping
RKManagedObjectMapping* albumMapping = [RKManagedObjectMapping mappingForClass:[Album class]];
albumMapping.primaryKeyAttribute = @"albumId";
[albumMapping mapKeyPath:@"albumId" toAttribute:@"albumId"];
[albumMapping mapKeyPath:@"albumName" toAttribute:@"albumName"];
[albumMapping mapKeyPath:@"albumPrice" toAttribute:@"albumPrice"];
[albumMapping mapKeyPath:@"trackCount" toAttribute:@"trackCount"];
// Configure ARTIST mapping
RKManagedObjectMapping* artistMapping = [RKManagedObjectMapping mappingForClass:[Artist class]];
artistMapping.primaryKeyAttribute = @"artistId";
[artistMapping mapKeyPath:@"artistId" toAttribute:@"artistId"];
[artistMapping mapKeyPath:@"artistName" toAttribute:@"artistName"];
[artistMapping mapKeyPath:@"albums" toRelationship:@"albums" withMapping:albumMapping];
// Register mappings with the provider
[[RKObjectManager sharedManager].mappingProvider setMapping:albumMapping forKeyPath:@"albums"];
[[RKObjectManager sharedManager].mappingProvider setMapping:artistMapping forKeyPath:@"artist"];
А потом в моей программе я загружаю данные:
RKObjectManager *objectManager = [RKObjectManager sharedManager];
[objectManager loadObjectsAtResourcePath:@"/artist/123/albums" delegate:self];
После того, как это выполнено, мое Базовое хранилище данных заполнено тремя объектами (один исполнитель и два альбома), но связь между ними не создается.
В результате я могу получить этот список альбомов напрямую или напрямую получить исполнителя. Но если я попытаюсь использовать: artist.albums
результат будет пустым.
Может кто-нибудь предложить предложения о том, что я могу делать не так, или как решить эту проблему?
Большое спасибо.
РЕДАКТИРОВАТЬ: обновление 10/26
Я просто настроил небольшой пример проекта с теми же настройками, и все было загружено правильно (т.е. объект исполнителя был создан с учетом его альбомов). К сожалению, это означает, что проблема заключается в моем более крупном проекте, а не в том, что я изложил здесь ранее. С учетом вышесказанного я продолжу блуждать и обновлять, поэтому, если у кого-нибудь есть совет, как устранить неполадки в этом или где конкретно искать, я был бы очень признателен.
РЕДАКТИРОВАТЬ: Решено
Смущающе, проблема была просто в том, что я использовал неправильный базовый URL. Завтра я выложу полную информацию (на случай, если это кому-нибудь еще поможет).