2012-05-02 2 views
1

Я хочу использовать RestKit для обслуживания Restful Webservice для связи между LAMP-средой и iOS-приложением. Поэтому я сделал первый тест, чтобы проверить, все ли это работает, как описано в доступных учебниках и на странице 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; 
    } 

?> 


URI для получения возвращаемого json-String - http://localhost/resttest/person(/index.php).


Мои проблемы:

  • Я всегда получаю эту ошибку, когда я не указать путь ресурса для '':

    E restkit.network:RKObjectLoader.m: 216 Обнаруженные ошибки во время отображения: Не удалось найти отображение объекта для ключа: «

и Я не знаю, почему это происходит. Ни один другой пример, который я попробовал, имеет эту проблему, но я не знаю, что я делаю неправильно.

  • Когда он работает (я должен изменить базовый 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. Это пол в iOS, в то время как ответ json возвращает жанр. Или это орфографическая ошибка? – 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

Смежные вопросы