我正在使用RestKit,我无法弄清楚如何使映射工作。我有一个Playlist
托管对象,它有许多Beat
个托管对象。
let playlistMapping = RKEntityMapping(forEntityForName: "Playlist", inManagedObjectStore: appDelegate.managedObjectStore)
playlistMapping.identificationAttributes = ["playlistId"]
playlistMapping.addAttributeMappingsFromDictionary(["id" : "playlistId", "name" : "name", "beats" : "beatIds"])
let beatMapping = RKEntityMapping(forEntityForName: "Beat", inManagedObjectStore: appDelegate.managedObjectStore)
beatMapping.identificationAttributes = ["beatId"]
beatMapping.addAttributeMappingsFromDictionary(["id" : "beatId", "name" : "name"])
playlistMapping.addConnectionForRelationship("playlistBeats", connectedBy: ["beatIds" : "beatId"])
let statusCodes = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)
let playlistResponseDescriptor = RKResponseDescriptor(mapping: playlistMapping, method: RKRequestMethod.Any, pathPattern: "/playlists/:id", keyPath: "playlist", statusCodes: statusCodes)
let beatResponseDescriptor = RKResponseDescriptor(mapping: beatMapping, method: RKRequestMethod.Any, pathPattern: "/beats/:id", keyPath: "beats", statusCodes: statusCodes)
这是JSON
{
"playlist": {
"id": "top-rated",
"beats": [
"180574",
"181515"
]
},
"beats": [
{
"id": "180574",
"producer": "14649",
"name": "On The Hunt"
},
{
"id": "181515",
"producer": "14649",
"name": "Anatomy"
}
]
}
以下是托管对象
@interface Playlist : NSManagedObject
@property (nonatomic, retain) NSString * playlistId;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) id beatIds;
@property (nonatomic, retain) NSSet *playlistBeats;
@end
@interface Beat : NSManagedObject
@property (nonatomic, retain) NSNumber * beatId;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) Producer *producer;
@end
当我运行时,我收到错误:
由于未捕获的异常而终止应用 'NSInvalidArgumentException',原因:'无法连接关系: 为源实体“播放列表”提供的无效属性:beats'
编辑:
我已经阅读了这个答案:Foreign key relationship mapping with RestKit但我不明白如何使它适用于我的特定JSON数据。
NSSet *beats
托管对象中已有Playlist
个属性。
在另一个问题的问题中,每个Team
单独User
- 我为每个Beats
设置了多个Playlist
。
编辑2:
好的,我在beatIds
实体中添加了Playlist
类型的瞬态属性Transformable
。我已将其映射为在beat
对象中保存playlist
id的数组。现在应用程序不再崩溃,但我不认为它正确处理关系。
<Playlist: 0x10dae81b0> (entity: Playlist; id: 0xd000000000040000 <x-coredata://F9813F68-CBAD-4947-81B5-C126E3BF33D9/Playlist/p1> ; data: {
beatIds = nil;
name = nil;
playlistBeats = "<relationship fault: 0x10dae6f10 'playlistBeats'>";
playlistId = "top-rated";
})