没有与核心数据和RestKit连接的关系

时间:2011-10-27 01:12:32

标签: ios core-data entity-relationship restkit

我一直在使用RestKit(0.9.3)在我的应用中填充一些核心数据。正确创建实体对象,但不创建它们之间的关系。据我所知,我根据以下内容正确设置了事项:

  1. https://github.com/RestKit/RestKit/wiki/Object-mapping
  2. 示例文件夹中的RKRelationshipMappingExample
  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

    我只是设置了一个具有相同配置的小样本项目,并且所有内容都已正确加载(即艺术家实体的创建与其相册的关系)。可悲的是,这意味着问题在我的大项目中,而不是我之前概述的内容。话虽如此,我会继续跋涉并更新,所以如果有人就如何排除故障或特别是在哪里进行排查提出建议,我将非常感激。

    编辑:已解决

    令人尴尬的是,问题只是因为我使用了错误的基本网址。我明天会发布完整的详细信息(万一它可以帮助其他人)。

1 个答案:

答案 0 :(得分:1)

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

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