4

特にRestKit0.20の例やドキュメントがほとんどないため、RestKitとCoreDataに少し苦労しています。

Songと多対1の関係を持つ(管理された)オブジェクトがありAlbumます。次のコードはJSONを投稿できますが、サーバーが除外するフラット化された形式では投稿できません。

// Defined elsewhere
Album *theAlbum;
RKObjectManager *objMan = [self objectManager];

// Response Mapping
RKObjectMapping *responseMapping = [RKObjectMapping mappingForClass:[Song class]];
[responseMapping addAttributeMappingsFromDictionary:@{ @"song": @"songID" }];
NSIndexSet *statusCodes = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful);
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:responseMapping
                                                                                   pathPattern:@"/api/song"
                                                                                       keyPath:nil
                                                                                   statusCodes:statusCodes];

// Request Mapping
RKObjectMapping *requestMapping = [RKObjectMapping requestMapping];
RKEntityMapping *albumRelationshipMapping = [RKEntityMapping mappingForEntityForName:@"Album" inManagedObjectStore:[objMan managedObjectStore]];
[albumRelationshipMapping addAttributeMappingsFromDictionary:@{@"id": @"albumID", }];
[requestMapping addAttributeMappingsFromDictionary:@{ @"title": @"title", @"length": @"length" }];
[requestMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"album"
                                                                               toKeyPath:@"album"
                                                                             withMapping:albumRelationshipMapping]];
requestMapping = [requestMapping inverseMapping];
RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:requestMapping objectClass:[Song class] rootKeyPath:nil];

[objMan addRequestDescriptor:requestDescriptor];
[objMan addResponseDescriptor:responseDescriptor];

// Create a new temporary song object
Song *song = [NSEntityDescription insertNewObjectForEntityForName:@"Song"
                                                inManagedObjectContext:[[objMan managedObjectStore] mainQueueManagedObjectContext]];
song.title = @"Some Title";
song.length = 123;
song.album = theAlbum;

// Post operation
objMan.requestSerializationMIMEType = RKMIMETypeJSON;
RKManagedObjectRequestOperation *operation = [objMan appropriateObjectRequestOperationWithObject:song
                                                                                          method:RKRequestMethodPOST
                                                                                            path:@"/api/song"
                                                                                      parameters:nil];
[operation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
    // Success
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
    // Failure
}];
[objMan enqueueObjectRequestOperation:operation];

このコードは、次のようなJSON本文を投稿します。

{"title":"Some Title","length":"123","album":{"id":"6e32ae476815f365"}}

ただし、サーバーは次のようなJSON本体を想定しています。

{"title":"Some Title","length":"123","album":"6e32ae476815f365"}

つまり、関係はネストされたオブジェクトではなく、フラット化された外部キーでalbumある必要があります。しかし、私がこのように変更しようとすると:albumRelationshipMapping

[albumRelationshipMapping setIdentificationAttributes:@[ @"albumID" ]];
[albumRelationshipMapping addAttributeMappingToKeyOfRepresentationFromAttribute:@"albumID"];

例外をスローします。(NSInvalidArgumentException', reason: '*** -[NSProxy doesNotRecognizeSelector:allKeys] called!'

誰かが私がここで間違っていることを知っていますか?それとも、私を正しい方向に導くことができるサンプルコードがありますか?

この質問がすでにどこかで回答されている場合は申し訳ありません。私はすべてのstackoverflowとgoogleグループを検索しましたが、私の場合の特定の解決策を見つけることができませんでした(RestKit 0.20、CoreData、FKのみとの関係)。

ありがとう、ダーク

4

1 に答える 1

5

この場合、ドット表記を使用してalbumIDを直接取得できると思います(RKRelationshipMappingを使用する必要はありません)

この方法でコードを更新してみてください:

// Request Mapping
RKObjectMapping *requestMapping = [RKObjectMapping requestMapping];
RKEntityMapping *albumRelationshipMapping = [RKEntityMapping mappingForEntityForName:@"Album" inManagedObjectStore:[objMan managedObjectStore]];
//[albumRelationshipMapping addAttributeMappingsFromDictionary:@{@"id": @"albumID", }];
//[requestMapping addAttributeMappingsFromDictionary:@{ @"title": @"title", @"length": @"length" }];
[requestMapping addAttributeMappingsFromDictionary:@{ @"title": @"title", @"length": @"length", @"album" : @"album.albumID" }];
//[requestMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"album"
//                                                                               toKeyPath:@"album"
//                                                                             withMapping:albumRelationshipMapping]];
于 2013-02-27T02:28:21.070 に答える