【发布时间】:2011-10-27 01:12:32
【问题描述】:
我一直在使用 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 个核心数据项:一位艺术家和两张专辑。艺术家实体有一个“专辑”关系,应该是这两张专辑的集合。
// 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。明天我会发布完整的详细信息(以防它可以帮助其他人)。
【问题讨论】:
-
你好,@johnytmc,你能给我发一个关于 Reskit 和 coredata 的完整和实际教程的链接吗?谷歌只提供非实际教程。谢谢!
标签: ios core-data entity-relationship restkit