2012-03-07 13 views
1
私はRestKit関係マッピング例を通じて働いている

を呼び出し、または呼び出しにタイプミスがある場合。彼らは何を参照していますか?オブジェクトローダーはいつこれらのキーパスでコンテンツに遭遇しますか?プロジェクト、タスクとユーザー:iOS RestKit [mappingProvider setMapping:forKeyPath:]メソッドの目的は何ですか?これらのメソッドの目的が何であるかを理解することはできません

[objectManager.mappingProvider setMapping:userMapping forKeyPath:@"user"]; 
[objectManager.mappingProvider setMapping:taskMapping forKeyPath:@"task"]; 
[objectManager.mappingProvider setMapping:projectMapping forKeyPath:@"project"]; 

データとしてロードされているJSONファイルは、3つのオブジェクトがあります。 タスクは複数のです。

コアデータモデルに定義されている3つのエンティティ(ユーザー、タスク、およびプロジェクト)があります。これらは大文字で始まります。

最後に、データモデルから導出されNSManagedObjectクラスは関係があります:タスク> assignedUserとユーザー]> [タスクのプロジェクトは定期的にNSObjectの

@「タスク」が「タスク」@であるべきであること?

@implementation RKRelationshipMappingExample 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     RKObjectManager* objectManager = [RKObjectManager objectManagerWithBaseURL:gRKCatalogBaseURL]; 
     objectManager.objectStore = [RKManagedObjectStore objectStoreWithStoreFilename:@"RKRelationshipMappingExample.sqlite"]; 


     RKManagedObjectMapping* taskMapping = [RKManagedObjectMapping mappingForClass:[Task class]]; 
     [taskMapping mapKeyPath:@"id" toAttribute:@"taskID"]; 
     [taskMapping mapKeyPath:@"name" toAttribute:@"name"]; 
     [taskMapping mapKeyPath:@"assigned_user_id" toAttribute:@"assignedUserID"]; 
     taskMapping.primaryKeyAttribute = @"taskID"; //uniquely identifies the record for update purposes 

     RKManagedObjectMapping* userMapping = [RKManagedObjectMapping mappingForClass:[User class]]; 
     [userMapping mapAttributes:@"name", @"email", nil]; 
     [userMapping mapKeyPath:@"id" toAttribute:@"userID"]; 
     userMapping.primaryKeyAttribute = @"userID"; 


     [objectManager.mappingProvider setMapping:userMapping forKeyPath:@"user"]; 
     [objectManager.mappingProvider setMapping:taskMapping forKeyPath:@"task"]; 

     [userMapping mapRelationship:@"tasks" withMapping:taskMapping];   
     [taskMapping mapRelationship:@"assignedUser" withMapping:userMapping]; 

     [taskMapping connectRelationship:@"assignedUser" withObjectForPrimaryKeyAttribute:@"assignedUserID"]; 


     // NOTE - Project is not backed by Core Data 
     RKObjectMapping* projectMapping = [RKObjectMapping mappingForClass:[Project class]]; 
     [projectMapping mapKeyPath:@"id" toAttribute:@"projectID"]; 
     [projectMapping mapAttributes:@"name", @"description", nil]; 
     [projectMapping mapRelationship:@"user" withMapping:userMapping]; 
     [projectMapping mapRelationship:@"tasks" withMapping:taskMapping]; 
     [objectManager.mappingProvider setMapping:projectMapping forKeyPath:@"project"]; 



    } 

    return self; 
} 

//more code 
@end 

ご清聴ありがとうございました!

答えて

1

RKObjectMappingProvider setMapping:forKeyPath:方法は、指定されたキーパスでデータが発生したときに使用するオブジェクトマッピングに関するマッピングプロバイダに指示します。例とその関連JSONデータの場合に、taskキーパスの実際のインスタンスが存在しない - ので、この特定の例では、[objectManager.mappingProvider setMapping:taskMapping forKeyPath:@"task"]文が必要とされません。別のケースでは、あなたは非常によく、それ必要とされるであろう、その場合には

"task":{"id":10,"name":"Some task", "assigned_user_id":5} 

のようなものがあるかもしれません。 JSONストリーム内の実際のタスクは、[projectMapping mapRelationship:@"tasks" withMapping:taskMapping]のためにマップされます。非常に便利 -

あなたはRestKitが何をしているか検査するRKLogConfigureByName()を使用することができます。この場合、RKLogConfigureByName("RestKit/ObjectMapping", RKLogLevelTrace)はマッピングロジックの "吹き飛ばし"を与えます。

関連する問題