2011-10-27 37 views
1

我一直在使用RestKit(0.9.3)在我的应用程序中填充一些核心数据。实体对象被正确创建,但它们之间的关系不会被创建。从我可以告诉,我有事情设置正确,根据:与核心数据和RestKit无关的关系

  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个核心数据项目:一个艺术家和两个专辑。艺术家实体有一个“专辑”关系,应该是这两个专辑的集合。

// 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。明天我会公布详细信息(以防其他人可以帮助其他人)。

+0

你好,@johnytmc,你可以给我发一个链接来完成Reskit和coredata的实际教程吗? Google只提供非实际的教程。谢谢! – Darmen

回答

1

那么......我们有一个决议。我很尴尬地说,问题只是我在我的主项目中使用了错误的基础URL。我对API的本地副本返回的JSON进行了一些更新,但基本url仍然指向联机API的副本。

我所做的更改是以这种方式格式化JSON,而不是将“艺术家”和“专辑”作为JSON中的独立实体。