Сущность (null) не соответствует кодированию ключевого значения для ключевого заголовка.

Я пытаюсь заставить RestKit и CoreData работать вместе. Подхожу ближе, но получаю следующую ошибку:

CoreData: error: Failed to call designated initializer on NSManagedObject class 'Book' 
*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: 
    '[<Book 0x8454560> valueForUndefinedKey:]: the entity (null) is not key value coding-compliant for the key "title".'

Мне кажется, что он успешно находит мой класс Book, и у него ДЕЙСТВИТЕЛЬНО есть свойство title. Что я делаю неправильно?


Books.xcdatamodel

Book
  title: String

У меня есть URL-адрес localhost:3000/books/initial, который возвращает следующий (JSON)

[{title:"one"}, {title:"two"}]

Я использую mogenerator для создания своих классов. Я ничего не добавил к Book, но для _Book явно определено свойство title.

Наконец, вот код, который я использую для загрузки запроса.

RKObjectManager* objectManager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"http://localhost:3000/"]];
RKManagedObjectStore* objectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:self.model];
objectManager.managedObjectStore = objectStore;

// Mappings
RKEntityMapping *bookMapping = [RKEntityMapping mappingForEntityForName:@"Book" inManagedObjectStore:objectStore];
[bookMapping addAttributeMappingsFromArray:@[@"title"]];

RKResponseDescriptor * responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:bookMapping pathPattern:@"books/initial/" keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];

[objectManager addResponseDescriptor:responseDescriptor];

// Send Request
[objectManager getObjectsAtPath:@"/books/initial/" parameters:nil success:^(RKObjectRequestOperation * operation, RKMappingResult *mappingResult) {
    NSLog(@"SUCCESS");
} failure: ^(RKObjectRequestOperation * operation, NSError * error) {
    NSLog(@"FAILURE %@", error);
}];

РЕДАКТИРОВАТЬ: я добавил следующие строки прямо перед частью //Send Request, найденной в приложении RKTwitterCoreData, но все равно получаю ту же ошибку

// Other Initialization (move this to app delegate)
[objectStore createPersistentStoreCoordinator];
[objectStore createManagedObjectContexts];

objectStore.managedObjectCache = [[RKInMemoryManagedObjectCache alloc] initWithManagedObjectContext:objectStore.persistentStoreManagedObjectContext];

person Sean Clark Hess    schedule 10.01.2013    source источник


Ответы (2)


Проблема заключалась в том, что путь был неправильным при отображении. У меня был http://localhost:3000/ в качестве моего домена, где он должен был быть http://localhost:3000, и у меня был books/initial/ в качестве пути, где он должен был быть /books/initial/.

См. RestKit 0.20 - CoreData: error: Не удалось вызвать назначенный инициализатор в классе NSManagedObject

Я также забыл создать постоянное хранилище. Вот полный рабочий пример:

// Core Data Example
// Initialize RestKIT
RKObjectManager* objectManager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"http://localhost:3000"]];
RKManagedObjectStore* objectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:self.model];
objectManager.managedObjectStore = objectStore;

// Mappings
RKEntityMapping *bookMapping = [RKEntityMapping mappingForEntityForName:@"Book" inManagedObjectStore:objectStore];
[bookMapping addAttributeMappingsFromArray:@[@"title"]];

RKResponseDescriptor * responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:bookMapping pathPattern:@"/books/initial/" keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];

[objectManager addResponseDescriptor:responseDescriptor];

// Other Initialization (move this to app delegate)
[objectStore createPersistentStoreCoordinator];

NSString *storePath = [RKApplicationDataDirectory() stringByAppendingPathComponent:@"RKTwitter.sqlite"];
NSString *seedPath = [[NSBundle mainBundle] pathForResource:@"RKSeedDatabase" ofType:@"sqlite"];
NSError *error;
NSPersistentStore *persistentStore = [objectStore addSQLitePersistentStoreAtPath:storePath fromSeedDatabaseAtPath:seedPath withConfiguration:nil options:nil error:&error];
NSAssert(persistentStore, @"Failed to add persistent store with error: %@", error);

[objectStore createManagedObjectContexts];

objectStore.managedObjectCache = [[RKInMemoryManagedObjectCache alloc] initWithManagedObjectContext:objectStore.persistentStoreManagedObjectContext];

// Send Request
[objectManager getObjectsAtPath:@"/books/initial/" parameters:nil success:^(RKObjectRequestOperation * operation, RKMappingResult *mappingResult) {
    NSLog(@"SUCCESS");
} failure: ^(RKObjectRequestOperation * operation, NSError * error) {
    NSLog(@"FAILURE %@", error);
}];
person Sean Clark Hess    schedule 11.01.2013

Я не вижу, где вы добавили постоянное хранилище. Вы забыли это сделать?

person Blake Watters    schedule 11.01.2013
comment
Это должно быть то, что мне не хватает. Пытаюсь найти в приложении твиттер. Все, что у меня есть, это вышеупомянутый + шаблон основных данных по умолчанию. - person Sean Clark Hess; 11.01.2013
comment
Я добавил createManagedObjectContexts, но не вижу, где в примере используется addPersistentStore. Это все еще не работает - person Sean Clark Hess; 11.01.2013