我一直在使用RestKit(0.9.3)在我的应用程序中填充一些核心数据。实体对象被正确创建,但它们之间的关系不会被创建。从我可以告诉,我有事情设置正确,根据:与核心数据和RestKit无关的关系
- 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的实际教程吗? Google只提供非实际的教程。谢谢! – Darmen