2012-05-02 3 views
1

안정적인 웹 서비스를 위해 RestKit을 사용하여 LAMP 환경과 iOS-App간에 통신하고 싶습니다. 따라서 사용 가능한 자습서 및 RestKit 페이지에 설명 된 것과 같이 모두 작동하는지 확인하는 첫 번째 테스트를 만들었습니다.Objective C + RESTKit : 객체 가져 오기 관련 문제

오른쪽 이제 코드는 다음과 같습니다

RKObjectManager* objectManager = [RKObjectManager managerWithBaseURLString:@"http://localhost/resttest"]; 

objectManager.client.requestQueue.showsNetworkActivityIndicatorWhenBusy = YES; 

#ifdef RESTKIT_GENERATE_SEED_DB 
    NSString *seedDatabaseName = nil; 
    NSString *databaseName = RKDefaultSeedDatabaseFileName; 
#else 
    NSString *seedDatabaseName = RKDefaultSeedDatabaseFileName; 
    NSString *databaseName = @"CoreData.sqlite"; 
#endif 

objectManager.objectStore = [RKManagedObjectStore objectStoreWithStoreFilename:databaseName usingSeedDatabaseName:seedDatabaseName managedObjectModel:nil delegate:self]; 

// Map Person Object 
RKManagedObjectMapping *personMapping = [RKManagedObjectMapping mappingForClass:[Person class] inManagedObjectStore:objectManager.objectStore]; 
//RKManagedObjectMapping *personMapping = [RKManagedObjectMapping mappingForEntityWithName:@"Person" inManagedObjectStore:[RKObjectManager sharedManager].objectStore]; 
[personMapping mapKeyPath:@"id" toAttribute:@"person_id"]; 
[personMapping mapKeyPath:@"firstname" toAttribute:@"person_firstname"]; 
[personMapping mapKeyPath:@"lastname" toAttribute:@"person_lastname"]; 
[personMapping mapKeyPath:@"gender" toAttribute:@"person_gender"]; 
personMapping.primaryKeyAttribute = @"id"; 


// Register our mappings with the provider;  
[objectManager.mappingProvider setMapping:personMapping forKeyPath:@"/person"]; 
objectManager.acceptMIMEType = RKMIMETypeJSON; 

#ifdef RESTKIT_GENERATE_SEED_DB 
    RKLogConfigureByName("RestKit/ObjectMapping", RKLogLevelInfo); 
    RKLogConfigureByName("RestKit/CoreData", RKLogLevelTrace); 
#endif 

[objectManager loadObjectsAtResourcePath:@"/person" delegate:self]; 



이처럼 내 관리 개체 모습입니다 :이 서버의 더미 코드입니다

@interface Person : NSManagedObject 

@property (nonatomic, retain) NSString * person_firstname; 
@property (nonatomic, retain) NSString * person_lastname; 
@property (nonatomic, retain) NSString * person_gender; 
@property (nonatomic, retain) NSNumber * person_id; 

@end 



그리고 일부 json 예제 문자열 만 반환하는 쪽 :

<?php 

    header('Content-type: application/json'); 

    if($_SERVER['REQUEST_METHOD'] == 'GET') 
    { 
     $json_string = '{ "persons": [ 
          { "id": "1", 
           "firstname": "hans", 
           "lastname": "maier", 
           "genre": "m" 
          }, 
          { "id": "2", 
           "firstname": "michael", 
           "lastname": "schmidt", 
           "genre": "w" 
          }] 
         }'; 

     echo $json_string; 
    } 

?> 


반환 된 json-String을 가져올 URI는 http://localhost/resttest/person(/index.php입니다.


내 문제는 다음과 같습니다

E restkit.network:RKObjectLoader.m : 내가 ''에 대한 리소스 경로를 정의하지 않는 경우

  • 난 항상이 오류를 얻을 : 216 매핑 중 오류가 발생했습니다 : keyPath에 대한 객체 매핑을 찾을 수 없습니다 : ''

및 나는 이것이 왜 일어나는 지 모른다. 내가 시도한 다른 예제는이 문제가 없지만, 내가 잘못하고있는 것에 대한 단서가 없다.

  • 작동하면 (기본 URL을 http://localhost/resttest/person으로 변경해야 함) 오류 대신 빈 개체가 나타납니다. 지금 난 내가 잘못 알고하지 않기 때문에



나는이 주제에 어떤 도움을 주셔서 감사합니다.

감사합니다.

편집 03.05.2012 :

여기

내가 로그에 무엇을 얻을 수 있습니다 :

2012-05-03 12:52:05.067 RESTKitCoreDataTest[5139:13807] D restkit.object_mapping:RKObjectMapper.m:320 Performing object mapping sourceObject: { 
    persons =  (
       { 
      firstname = hans; 
      gender = m; 
      id = 1; 
      lastname = maier; 
     }, 
       { 
      firstname = michael; 
      gender = w; 
      id = 2; 
      lastname = schmidt; 
     } 
    ); 
} 
and targetObject: (null) 
2012-05-03 12:52:05.067 RESTKitCoreDataTest[5139:13807] T restkit.object_mapping:RKObjectMapper.m:278 Examining keyPath '' for mappable content... 
2012-05-03 12:52:05.067 RESTKitCoreDataTest[5139:13807] D restkit.object_mapping:RKObjectMapper.m:264 Found mappable data at keyPath '': { 
    persons =  (
       { 
      firstname = hans; 
      gender = m; 
      id = 1; 
      lastname = maier; 
     }, 
       { 
      firstname = michael; 
      gender = w; 
      id = 2; 
      lastname = schmidt; 
     } 
    ); 
} 
2012-05-03 12:52:05.073 RESTKitCoreDataTest[5139:13807] D restkit.object_mapping:RKObjectMapper.m:210 Asked to map source object { 
    persons =  (
       { 
      firstname = hans; 
      gender = m; 
      id = 1; 
      lastname = maier; 
     }, 
       { 
      firstname = michael; 
      gender = w; 
      id = 2; 
      lastname = schmidt; 
     } 
    ); 
} with mapping <RKManagedObjectMapping:0x811eb60 objectClass=Person keyPath mappings => (
    "RKObjectKeyPathMapping: id => person_id", 
    "RKObjectKeyPathMapping: firstname => person_firstname", 
    "RKObjectKeyPathMapping: lastname => person_lastname", 
    "RKObjectKeyPathMapping: gender => person_gender" 
)> 
2012-05-03 12:52:05.074 RESTKitCoreDataTest[5139:13807] D restkit.object_mapping:RKObjectMappingOperation.m:617 Starting mapping operation... 
2012-05-03 12:52:05.074 RESTKitCoreDataTest[5139:13807] T restkit.object_mapping:RKObjectMappingOperation.m:618 Performing mapping operation: RKObjectMappingOperation for 'Person' object. Mapping values from object { 
    persons =  (
       { 
      firstname = hans; 
      gender = m; 
      id = 1; 
      lastname = maier; 
     }, 
       { 
      firstname = michael; 
      gender = w; 
      id = 2; 
      lastname = schmidt; 
     } 
    ); 
} to object <Person: 0x6e295d0> (entity: Person; id: 0x6e29610 <x-coredata:///Person/t99EFF6DC-EBDA-405C-8AFF-D082E4A8542F2> ; data: { 
    "person_firstname" = nil; 
    "person_gender" = nil; 
    "person_id" = 0; 
    "person_lastname" = nil; 
}) with object mapping <RKManagedObjectMapping:0x811eb60 objectClass=Person keyPath mappings => (
    "RKObjectKeyPathMapping: id => person_id", 
    "RKObjectKeyPathMapping: firstname => person_firstname", 
    "RKObjectKeyPathMapping: lastname => person_lastname", 
    "RKObjectKeyPathMapping: gender => person_gender" 
)> 
2012-05-03 12:52:05.074 RESTKitCoreDataTest[5139:13807] T restkit.object_mapping:RKObjectMappingOperation.m:388 Did not find mappable attribute value keyPath 'id' 
2012-05-03 12:52:05.074 RESTKitCoreDataTest[5139:13807] T restkit.object_mapping:RKObjectMappingOperation.m:388 Did not find mappable attribute value keyPath 'firstname' 
2012-05-03 12:52:05.075 RESTKitCoreDataTest[5139:13807] T restkit.object_mapping:RKObjectMappingOperation.m:388 Did not find mappable attribute value keyPath 'lastname' 
2012-05-03 12:52:05.075 RESTKitCoreDataTest[5139:13807] T restkit.object_mapping:RKObjectMappingOperation.m:388 Did not find mappable attribute value keyPath 'gender' 
2012-05-03 12:52:05.075 RESTKitCoreDataTest[5139:13807] D restkit.object_mapping:RKObjectMappingOperation.m:638 Mapping operation did not find any mappable content 
2012-05-03 12:52:05.075 RESTKitCoreDataTest[5139:13807] T restkit.core_data:RKManagedObjectMappingOperation.m:98 relationshipsAndPrimaryKeyAttributes: { 
} 
2012-05-03 12:52:05.075 RESTKitCoreDataTest[5139:13807] D restkit.object_mapping:RKObjectMapper.m:351 The following operations are in the queue: (
) 
2012-05-03 12:52:05.075 RESTKitCoreDataTest[5139:13807] D restkit.object_mapping:RKObjectMapper.m:366 Finished performing object mapping. Results: { 
} 
2012-05-03 12:52:05.080 RESTKitCoreDataTest[5139:fb03] Loaded persons: (
) 
+0

반송 된 json 응답의 키가 iOS의 매핑과 동일하지 않은 것을 확인했습니다. json 응답이 장르를 반환하는 동안 iOS에서는 성별입니다. 또는이 철자 실수입니까 ?? – LonelyDeveloper

+0

당신이 맞아요, 고마워요.하지만 결국에는 차이가 없습니다 - 같은 오류. 또한 XML 데이터로 시도해 보았습니다. 매핑이 정확했으며 아무런 문제가 없었습니다. – chritaso

+0

개체 매핑 추적을 다음과 같이 설정해보십시오. RKLogConfigureByName ("RestKit/ObjectMapping", RKLogLevelTrace); –

답변

1

가능성 1 :

당신이 잘못된 키 패스로 매핑을 설정하는 것으로 보인다.

// Register our mappings with the provider;  
[objectManager.mappingProvider setMapping:personMapping forKeyPath:@"persons"]; 

을 시도하고 작동하는지 확인합니다.

가능성 2 :

가 당신의 매핑에 JSON의 루트 경로를 지정합니다.

// Map Person Object 
RKManagedObjectMapping *personMapping = [RKManagedObjectMapping mappingForClass:[Person class] inManagedObjectStore:objectManager.objectStore]; 
[personMapping mapKeyPath:@"id" toAttribute:@"person_id"]; 
[personMapping mapKeyPath:@"firstname" toAttribute:@"person_firstname"]; 
[personMapping mapKeyPath:@"lastname" toAttribute:@"person_lastname"]; 
[personMapping mapKeyPath:@"gender" toAttribute:@"person_gender"]; 
personMapping.rootKeyPath = @"persons"; 
personMapping.primaryKeyAttribute = @"id"; 

을 시도하고 작동하는지 확인합니다.

+0

아니요, 불행히도 아무 것도 변경되지 않습니다. 그럼에도 불구하고 당신의 대답에 감사드립니다. – chritaso

+0

내 대답이 다른 아이디어로 업데이트되었습니다. 나는 현재이 프로젝트에서 두 가지 방법을 사용하고있다. – flashfabrixx