2013-01-10 29 views
5

Tôi đang cố gắng để có được RestKit và CoreData để làm việc cùng nhau. Tôi đang nhận được gần hơn, nhưng tôi nhận được lỗi sau:Thực thể (null) không tuân thủ mã hóa khóa giá trị cho "tiêu đề" chính

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".' 

Dường như với tôi rằng nó đang tìm lớp Sách của tôi thành công, và nó có một tài sản tiêu đề. Tôi đang làm gì sai?


Books.xcdatamodel

Book 
    title: String 

Tôi có một url tại localhost:3000/books/initial trả sau (JSON)

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

Tôi đang sử dụng mogenerator để tạo ra các lớp học của tôi. Tôi chưa thêm bất kỳ điều gì vào số Book, nhưng _Book rõ ràng có thuộc tính tiêu đề được xác định.

Cuối cùng, đây là mã tôi sử dụng để tải yêu cầu.

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); 
}]; 

EDIT: tôi đã thêm các dòng sau đây vào trước //Send Request phần, được tìm thấy trong các ứng dụng RKTwitterCoreData, nhưng tôi vẫn nhận được lỗi tương tự

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

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

Trả lời

4

Vấn đề là đường dẫn không chính xác trong ánh xạ. Tôi đã có http://localhost:3000/ làm miền của mình, nơi nó phải là http://localhost:3000 và tôi có books/initial/ là đường dẫn cần có là /books/initial/.

Xem RestKit 0.20 — CoreData: error: Failed to call designated initializer on NSManagedObject class

Tôi cũng quên tạo cửa hàng liên tục. Dưới đây là ví dụ làm việc đầy đủ:

// 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); 
}]; 
2

Tôi không thấy nơi bạn đã thêm một cửa hàng liên tục. Bạn đã quên làm như vậy?

+0

Đó phải là những gì tôi bị thiếu. Tôi đang cố gắng tìm nó trong ứng dụng twitter. Tất cả những gì tôi có là ở trên + mẫu dữ liệu cốt lõi mặc định. –

+0

Tôi đã thêm 'createManagedObjectContexts' nhưng tôi không thấy nơi ví dụ sử dụng' addPersistentStore'. Nó vẫn không hoạt động –

Các vấn đề liên quan