4

RestKit 0.20pre6 を使用して NSManagedObject を投稿すると、Rails サイトに nil 値のエントリが作成されるという問題が発生します。マッパーを疑いますが、RK オブジェクトを私の知る限り正しくセットアップしました。例はほとんどなく、サポートも限られています。この例では、CoreData ではなく NSObject を扱っているため、いくつかの仮定を行う必要がありました。

これが投稿用のコードで、その後にコンソール出力が続きます。アプリはサーバーからオブジェクトを正常に取得します。

        // Sync the added object to the server
    // ****************************************

    RKObjecMapping *responseMapping = [RKObjectMapping mappingForClass:[Event class]];
//  RKEntityMapping *responseMapping = [RKEntityMapping mappingForEntityForName:@"Event" inManagedObjectStore:self.managedObjectStore];
    [responseMapping addAttributeMappingsFromDictionary:@{
     @"id": @"eventId",
     @"name": @"name",
     @"amount": @"amount",
     @"length": @"length",
     @"updated_at": @"updatedAt",
     @"created_at": @"createdAt",
     @"latitude": @"latitude",
     @"longitude": @"longitude",
     @"thumbnail": @"thumbnail",
     @"airTemp": @"airTemp",
     }];

    NSIndexSet *statusCodes = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful); // Anything in 2xx
    RKResponseDescriptor *eventDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:responseMapping
                                                                                    pathPattern:@"/events"
                                                                                        keyPath:@"events"
                                                                                    statusCodes:statusCodes
                                                                                                ];

    RKObjectMapping *requestMapping = [RKObjectMapping requestMapping]; // objectClass == NSMutableDictionary

    [requestMapping addAttributeMappingsFromDictionary:@{
     @"id": @"eventId",
     @"name": @"name",
     @"amount": @"amount",
     @"length": @"length",
     @"updated_at": @"updatedAt",
     @"created_at": @"createdAt",
     @"latitude": @"latitude",
     @"longitude": @"longitude",
     @"thumbnail": @"thumbnail",
     @"airTemp": @"airTemp",
     }];


    // For any object of class Article, serialize into an NSMutableDictionary using the given mapping and nest
    // under the 'article' key path
    RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:requestMapping
                                                                                   objectClass:[Event class]
                                                                                   rootKeyPath:@"events"
                                                                                                ];

    LocationsAppDelegate *appDelegate = (LocationsAppDelegate *)[[UIApplication sharedApplication] delegate];
//  RKObjectManager *manager = [RKObjectManager managerWithBaseURL:gBaseURL];


    [RKObjectManager sharedManager].requestSerializationMIMEType = RKMIMETypeJSON;
    [[RKObjectManager sharedManager] addRequestDescriptor:requestDescriptor];
    [[RKObjectManager sharedManager] addResponseDescriptor:eventDescriptor];

    NSLog(@"RVC-addEvent %@ - %@", appDelegate.user.login, appDelegate.user.password);
    [[NBEventManager sharedManager] setUsername:appDelegate.user.login andPassword:appDelegate.user.password];
    appDelegate.objectManager.HTTPClient = [NBEventManager sharedManager];


    event = [eventsArray objectAtIndex:0];
    [[RKObjectManager sharedManager] postObject:event
                                           path:@"/events"
                                     parameters:nil
                                        success:nil
                                        failure:nil
                                                ];

}

2013-01-15 23:25:52.857 魚[38803:13403] 私は restkit.network:RKHTTPRequestOperation.m:152 POST 'http://localhost:3000/events' 2013-01-15 23:25:52.969 魚[ 38803:16903] 私は restkit.network:RKHTTPRequestOperation.m:179 POST 'http://localhost:3000/events' (201 作成) [0.1121 秒] 2013-01-15 23:25:52.971 魚[38803:17507] D restkit.object_mapping:RKMapperOperation.m:360 表現のマッピング操作を実行中: { event = { airTemp = ""; 金額 = ""; "created_at" = "2013-01-16T04:25:52Z"; ID = 54; 緯度 = ""; 長さ = ""; 経度 = ""; 名前 = ""; サムネイル = ""; "updated_at" = "2013-01-16T04:25:52Z"; "user_id" = ""; }; } および targetObject: (エンティティ: イベント; id: 0x9c7f710 ; データ: { airTemp = 0; amount = nil; createdAt = "2013-01-16 04:25:52 +0000"; eventId = 0; latitude = "28.158466" ; 長さ = 0; 経度 = "-82.509215"; 名前 = nil; 写真 = nil; サムネイル = nil; updatedAt = nil; }) 2013-01-15 23:25:52.971 fish[38803:17507] D restkit.object_mapping :RKMapperOperation.m:287 keyPath 'event' でマッピング可能なデータが見つかりました: { airTemp = ""; 金額 = ""; "created_at" = "2013-01-16T04:25:52Z"; ID = 54; 緯度 = ""; 長さ = ""; 経度 = ""; 名前 = ""; サムネイル = ""; "updated_at" = "2013-01-16T04:25:52Z"; "user_id" = ""; } 2013-01-15 23:25:52.971 fish[38803:17507] D restkit.object_mapping:RKMapperOperation.m:232 ソース オブジェクトのマッピングを要求 { airTemp = ""; 金額 = ""; "created_at" = "2013-01-16T04:25:52Z"; ID = 54; 緯度 = ""; 長さ = ""; 経度 = ""; 名前 = ""; サムネイル = ""; "updated_at" = "2013-01-16T04:25:52Z"; "user_id" = ""; } マッピング eventId>"、" name>"、" amount>"、" length>"、" updatedAt>"、" createdAt>"、" latitude>"、"経度>"、"空気温度>"、"サムネイル>")> 2013-01-15 23:25:52.971 fish[38803:17507] D restkit.object_mapping:RKMappingOperation.m:754 マッピング操作を開始しています... 2013- 01-15 23:25:52.972 fish[38803:17507] D restkit.object_mapping:RKMappingOperation.m:818 マッピング操作が正常に完了しました... 2013-01-15 23:25:52.973 fish[38803:17507] D restkit. object_mapping:RKMapperOperation.m:316 keyPath でマッピングできない値が見つかりました: events 2013-01-15 23:25:52.973 fish[38803:17507] D restkit.object_mapping:RKMapperOperation.m:389 オブジェクト マッピングの実行が完了しました。結果: { event = " (エンティティ: イベント; id: 0x9c7f710 ; データ: {\n airTemp = nil;\n amount = nil;\n createdAt = \"2013-01-16 04:25:52 +0000\" ;\n eventId = 54;\n 緯度 = nil; 13403] D restkit.core_data:RKManagedObjectRequestOperation.m:534 孤立したオブジェクトの削除のスキップ: GET リクエストに対してのみ実行されます。2013-01-15 23:25:52.976 fish[38803:11f03] D restkit.core_data:RKManagedObjectRequestOperation.m:599 マップされたターゲット オブジェクトを更新しています (エンティティ: イベント; id: 0x9c7f710 ; データ: { airTemp = nil; amount = nil; createdAt = "2013-01-16 04:25:52 +0000"; eventId = 54; 緯度 = nil; 長さ = nil; 経度 = nil; 名前 = nil; 写真 = nil; サムネイル = nil; updatedAt = "2013- 01-16 04:25:52 +0000"; }) コンテキスト内 13403] D restkit.core_data:RKManagedObjectRequestOperation.m:534 孤立したオブジェクトの削除のスキップ: GET リクエストに対してのみ実行されます。2013-01-15 23:25:52.976 fish[38803:11f03] D restkit.core_data:RKManagedObjectRequestOperation.m:599 マップされたターゲット オブジェクトを更新しています (エンティティ: イベント; id: 0x9c7f710 ; データ: { airTemp = nil; amount = nil; createdAt = "2013-01-16 04:25:52 +0000"; eventId = 54; 緯度 = nil; 長さ = nil; 経度 = nil; 名前 = nil; 写真 = nil; サムネイル = nil; updatedAt = "2013- 01-16 04:25:52 +0000"; }) コンテキスト内

すべてのマッピングをアプリ デリゲートに移動し、RKEntityMapping を実装したので、これが私のコードです。POST 呼び出しに添付された JSON オブジェクトはまだ得られません。

    RKEntityMapping *eventMapping = [RKEntityMapping mappingForEntityForName:@"Event" inManagedObjectStore:managedObjectStore];
[eventMapping addAttributeMappingsFromDictionary:@{
 @"id": @"eventId",
 @"name": @"name",
 @"amount": @"amount",
 @"length": @"length",
 @"updated_at": @"updatedAt",
 @"created_at": @"createdAt",
 @"latitude": @"latitude",
 @"longitude": @"longitude",
 @"thumbnail": @"thumbnail",
 @"airTemp": @"airTemp",
 }];
eventMapping.identificationAttributes = @[ @"eventId" ];

//RKRelationshipMapping *eventRelationship = [RKRelationshipMapping relationshipMappingFromKeyPath:@"events"
//                                                                                     toKeyPath:@"events"
//                                                                                   withMapping:eventMapping];
//[eventMapping addPropertyMapping:eventRelationship];

// Register our mappings with the provider
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:eventMapping
                                                                                   pathPattern:nil
                                                                                       keyPath:@"event"
                                                                                   statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[objectManager addResponseDescriptor:responseDescriptor];

RKEntityMapping *eventRequestMapping = [eventMapping inverseMapping];
RKRequestDescriptor *eventRequestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:eventRequestMapping
                                                                                    objectClass:[Event class]
                                                                                    rootKeyPath:@"event"
                                                                                                ];
[objectManager addRequestDescriptor:eventRequestDescriptor];
[RKObjectManager sharedManager].requestSerializationMIMEType = RKMIMETypeJSON;
4

3 に答える 3

5

RESTKit 0.20pre6 にはバグがあり、オブジェクトであっても POST リクエストで HTTP ボディを (null) として NSLog に出力します。開発ブランチで修正しました。 https://github.com/RestKit/RestKit/pull/1139

于 2013-01-21T17:23:45.910 に答える
2

NSManagedObjectマッピングには、使用しているRestKitのバージョンに応じて、 の代わりに または を使用する必要がありRKManagedObjectMappingます。最後のものを使用している場合は、.RKEntityMappingRKObjectMappingRKEntityMapping

との指定された初期化子が同じNSObjectNSManagedObjectはないため、null 値になります。

オブジェクト マッピングの詳細については、Wiki サイト ( RestKit Object Mapping、特に Core Data 部分) を参照してください。

于 2013-01-20T16:06:03.100 に答える
1

managedObjectContexts と、特に RestKit がそれらのうちの 2 つをどのように利用するかについて理解を深めた後、適切なコンテキストに入ることができました。createContexts を使用して、mainQueue と persistentStore コンテキストの 2 つが作成されます。また、データ モデルで Event Entity を選択し、クラスを NSManagedObject から Event に変更し、RestKit がエンティティをクラス Event のエンティティとして認識する必要があったこともありません。

于 2013-02-05T16:44:22.013 に答える