2012-05-02 35 views
1

我想使用RestKit爲Restful Webservice在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)。


我的問題是:

  • 我總是得到這個錯誤,當我不定義 '' 的資源路徑:

    èrestkit.network:RKObjectLoader.m: 216映射期間遇到錯誤:找不到keyPath的對象映射:''

和我不知道爲什麼會發生這種情況。沒有其他例子我嘗試過這個問題,但我不知道我做錯了什麼。



我想知道關於這個話題的任何幫助,因爲現在我不知道我做錯了。

謝謝!

編輯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中的映射不一樣。它是iOS中的性別,而json響應返回類型。或者這是一個拼寫錯誤? – LonelyDeveloper

+0

你是對的,謝謝,但最終它沒有什麼區別 - 同樣的錯誤。我也用XML數據嘗試過,那裏的映射是正確的,也沒有發生任何事情。 – chritaso

+0

嘗試使用以下命令轉換對象映射跟蹤:RKLogConfigureByName(「RestKit/ObjectMapping」,RKLogLevelTrace); –

回答

1

可能性1:

看來你的設置映射到錯誤的keyPath。

嘗試

// 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