2012-07-08 53 views
0

这是我第一个使用RestKit的项目,我试图让我简单的iOS应用程序与使用Tastypie包的Django应用程序提供的一组API同步。我的iOS应用程序基于Core Data Default Xcode应用程序。RestKit与Django-Tastypie的集成

我正在尝试从一个简单的模型对象:

车(名称(字符串),公共(布尔),ID(整数),创建(日期时间))

我的API看起来,对于集合:

http://www.example.com/api/v1/car/?format=json

{"meta": {"limit": 20, "next": null, "offset": 0, "previous": null, "total_count": 1}, "objects": [{"created": "2012-07-04T13:47:37+00:00", "id": "1", "name": "BMW", "public": true, "resource_uri": "\/api\/v1\/car\/1\/",}]} 

而对于1个对象:

http://www.example.com/api/v1/car/1/?format=json

{"created": "2012-07-04T13:47:37+00:00", "id": "1", "name": "BMW", "public": true, "resource_uri": "\/api\/v1\/car\/1\/",} 

鉴于这种情况下,在我的iOS应用程序,我已经在我的应用程序配置我的商店代表

-(void)configureObjectStore { 
// Initialize the RestKit Object Manager 
RKObjectManager *objectManager = [RKObjectManager objectManagerWithBaseURL:[[NSURL alloc] initWithString:@"http://www.example.com/api/v1"]]; 
objectManager.client.requestQueue.showsNetworkActivityIndicatorWhenBusy = YES; 

// Initialize object store 
objectManager.objectStore = [RKManagedObjectStore objectStoreWithStoreFilename:@"database.sqlite"]; 

[self coreDataMapping]; 
} 

而且通过应用代理(不知道这应该设置在我的映射在这里...)

- (void)coreDataMapping { 
// Now for the object mappings 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Car" inManagedObjectContext:self.managedObjectContext]; 
RKManagedObjectMapping* carMapping = [RKManagedObjectMapping mappingForEntity:entity inManagedObjectStore:[RKObjectManager sharedManager].objectStore]; 
[carMapping mapKeyPath:@"id" toAttribute:@"carId"]; 
[carMapping mapAttributes:@"name", nil]; 
[carMapping mapKeyPath:@"public" toAttribute:@"public"]; 
[carMapping mapKeyPath:@"created" toAttribute:@"created"]; 
carMapping.primaryKeyAttribute = @"carId"; 

[[RKObjectManager sharedManager].mappingProvider addObjectMapping:carMapping]; 
} 

然后在我的主控制器,我在哪里T以表视图加载所有我的对象(所有的汽车)

- (void)loadData { 
// Load the object model via RestKit 
RKObjectManager* objectManager = [RKObjectManager sharedManager]; 
[objectManager loadObjectsAtResourcePath:@"/car/1/?format=json" usingBlock:^(RKObjectLoader *loader) { 
loader.objectMapping = [objectManager.mappingProvider objectMappingForClass:[Car class]]; 
loader.delegate = self; 
}]; 
} 

当我火我的应用程序并尝试加载的对象列表,它会触发从委托的didFailWithError方法和我有以下堆栈:

I restkit.core_data:RKInMemoryManagedObjectCache.m:34 Creating thread-local entity cache for managed object context: <NSManagedObjectContext: 0x887f1b0> 
I restkit.core_data:RKInMemoryManagedObjectCache.m:50 Caching instances of Entity 'Car' by primary key attribute 'carId' 
E restkit.core_data:RKManagedObjectStore.m:262 Core Data Save Error 
           NSLocalizedDescription: (null) 
           NSValidationErrorKey: (null) 
           NSValidationErrorPredicate: (null) 
           NSValidationErrorObject: (null) 
E restkit.core_data:RKManagedObjectLoader.m:167 Failed to save managed object context after mapping completed: The operation couldn’t be completed. (Cocoa error 134020.) 
Hit error: Error Domain=NSCocoaErrorDomain Code=134020 "The operation couldn’t be completed. (Cocoa error 134020.)" UserInfo=0x89612c0 {NSAffectedObjectsErrorKey=<Car: 0x6c85670> (entity: Car; id: 0x6c65790 <x-coredata:///Car/t318CE65F-E4FE-44E1-813B-GEZG54> ; data: { 
    created = "2012-07-04 13:47:37 +0000"; 
    favorites =(); (Note this relation is not mapped in the API but it is not required) 
    carId = 1; 
    modified = nil; 
    name = BMW; 
    public = 1; 
}), NSUnderlyingException=Store <NSSQLCore: 0x88848c0> (URL: file://localhost/Users/me/Library/Application%20Support/Documents/database.sqlite) cannot hold instances of entity (<NSEntityDescription: 0x886f650>) name Car, managedObjectClassName Car, renamingIdentifier Car, isAbstract 0, superentity name (null), properties { 
created = "(<NSAttributeDescription: 0x886dce0>), name created, isOptional 1, isTransient 0, entity Car, renamingIdentifier created, validation predicates (\n), warnings (\n), versionHashModifier (null)\n userInfo {\n}, attributeType 900 , attributeValueClassName NSDate, defaultValue (null)"; 
favorites = "(<NSRelationshipDescription: 0x886e900>), name favorites, isOptional 1, isTransient 0, entity Car, renamingIdentifier favorites, validation predicates (\n), warnings (\n), versionHashModifier (null)\n userInfo {\n}, destination entity Favorite, inverseRelationship list, minCount 0, maxCount 0, isOrdered 0, deleteRule 1"; 
carId = "(<NSAttributeDescription: 0x886dd80>), name carId, isOptional 1, isTransient 0, entity Car, renamingIdentifier carId, validation predicates (\n), warnings (\n), versionHashModifier (null)\n userInfo {\n}, attributeType 100 , attributeValueClassName NSNumber, defaultValue 0"; 
name = "(<NSAttributeDescription: 0x886de20>), name name, isOptional 1, isTransient 0, entity Car, renamingIdentifier name, validation predicates (\n), warnings (\n), versionHashModifier (null)\n userInfo {\n}, attributeType 700 , attributeValueClassName NSString, defaultValue (null)"; 
public = "(<NSAttributeDescription: 0x886de70>), name public, isOptional 1, isTransient 0, entity Car, renamingIdentifier public, validation predicates (\n), warnings (\n), versionHashModifier (null)\n userInfo {\n}, attributeType 800 , attributeValueClassName NSNumber, defaultValue (null)"; 
}, subentities (null), userInfo { 
}, versionHashModifier (null)} 

我已经尝试了很多东西,但我有这样的感觉,我在这里绕圈子。任何建议将受到热烈欢迎。

谢谢您的时间和支持, 问候,

PS:我们应该能够排除无关RestKit自应用程序整合前工作顺利进行的错误。

回答

4

由于这个问题没有答案,所以我会自己回答这些问题。

我实际上已经放弃了RestKit,这肯定是非常强大的,但我不能弯曲它足够,所以它可以与Django-Tastypie一起使用,而我去了AFNetworking,这是低级别但允许我做我自己的API核心数据后端,变成了相当方便。

我希望这可以帮助其他一些迷失的灵魂。 Regards,