我一直在使用RestKit(0.9.3)在我的应用中填充一些核心数据。正确创建实体对象,但不创建它们之间的关系。据我所知,我根据以下内容正确设置了事项:
所以,这是我从服务器回来的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];
执行此操作后,我的Core Data存储区将填充三个对象(一个艺术家和两个专辑),但不会创建它们之间的关系。
结果是我可以直接获取此专辑列表,或者我可以直接获取该艺术家。但是,如果我尝试使用:artist.albums
,结果为空。
任何人都可以提出有关我可能做错的建议,或者如何进一步解决此问题?
非常感谢。
编辑:更新10/26
我只是设置了一个具有相同配置的小样本项目,并且所有内容都已正确加载(即艺术家实体的创建与其相册的关系)。可悲的是,这意味着问题在我的大项目中,而不是我之前概述的内容。话虽如此,我会继续跋涉并更新,所以如果有人就如何排除故障或特别是在哪里进行排查提出建议,我将非常感激。
编辑:已解决
令人尴尬的是,问题只是因为我使用了错误的基本网址。我明天会发布完整的详细信息(万一它可以帮助其他人)。
答案 0 :(得分:1)
嗯......我们有一个决议。我很尴尬地说,问题只是我在我的主项目中使用了错误的基本网址。我对API的本地副本返回的JSON进行了一些更新,但基本URL仍指向在线API的副本。
我所做的更改是以这种方式格式化JSON,而不是让“artist”和“albums”成为JSON中的单独实体。