Отношения, не связанные с основными данными и RestKit - PullRequest
1 голос
/ 27 октября 2011

Я работал с RestKit (0.9.3), чтобы заполнить некоторые базовые данные в моем приложении. Объекты сущности созданы правильно, но отношения между ними не созданы. Из того, что я могу сказать, у меня все настроено правильно в соответствии с:

  1. https://github.com/RestKit/RestKit/wiki/Object-mapping
  2. 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. Завтра я выложу полную информацию (на случай, если это кому-нибудь еще поможет).

1 Ответ

1 голос
/ 27 октября 2011

Ну ... у нас есть разрешение.Мне стыдно сказать, что проблема была просто в том, что я использовал неправильный базовый URL в своем основном проекте.Я сделал некоторые обновления в JSON, возвращенном локальной копией API, но базовый URL все еще указывал на копию API в Интернете.

Внесенное мною изменение заключалось в том, чтобы форматировать JSON таким образом, вместо того, чтобы "исполнитель" и "альбомы" были отдельными объектами в JSON.

...