与 Core Data 和 RestKit 无关的关系

Posted

技术标签:

【中文标题】与 Core Data 和 RestKit 无关的关系【英文标题】:Relationships not Connected with Core Data and RestKit 【发布时间】: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 的完整和实际教程的链接吗?谷歌只提供非实际教程。谢谢! 【参考方案1】:

嗯...我们有一个解决方案。我很尴尬地说,问题仅仅是我在我的主项目中使用了错误的基本 url。我对 API 的本地副本返回的 JSON 进行了一些更新,但基本 url 仍然指向在线 API 的副本。

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

【讨论】:

以上是关于与 Core Data 和 RestKit 无关的关系的主要内容,如果未能解决你的问题,请参考以下文章

RestKit 0.2 映射 Core Data <--> JSON 与一对多关系

带有 Core Data 陡峭学习曲线的 RestKit 0.10.1

RESTkit,Core Data:在将对象传输到 Core Data 之前对其进行处理

Core Data + RestKit 映射多对多关系?

如何将 PUT 请求添加到 RestKit + Core Data?

RestKit / Core Data:远程删除的实体不会从 Core Data 中删除