我正在尝试使用新的RestKit 0.9.3中的示例RKCatalog。 在RKRelationshipMappingExample中,创建者忘记在Task和User之间添加连接代码,但即使在添加后也无法正常工作。
{"project": {
"id": 123,
"name": "Produce RestKit Sample Code",
"description": "We need more sample code!",
"user": {
"id": 1,
"name": "Blake Watters",
"email": "blake@twotoasters.com"
},
"tasks": [
{"id": 1, "name": "Identify samples to write", "assigned_user_id": 1},
{"id": 2, "name": "Write the code", "assigned_user_id": 1},
{"id": 3, "name": "Push to Github", "assigned_user_id": 1},
{"id": 4, "name": "Update the mailing list", "assigned_user_id": 1}
]
}}
[taskMapping connectRelationship:@"assignedUser" withObjectForPrimaryKeyAttribute:@"assignedUserID"];
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
RKObjectManager* objectManager = [RKObjectManager objectManagerWithBaseURL:gRKCatalogBaseURL];
objectManager.objectStore = [RKManagedObjectStore objectStoreWithStoreFilename:@"RKRelationshipMappingExample.sqlite"];
RKManagedObjectMapping* taskMapping = [RKManagedObjectMapping mappingForClass:[Task class]];
[taskMapping mapKeyPath:@"id" toAttribute:@"taskID"];
[taskMapping setPrimaryKeyAttribute:@"taskID"];
[taskMapping mapKeyPath:@"name" toAttribute:@"name"];
[taskMapping mapKeyPath:@"assigned_user_id" toAttribute:@"assignedUserID"];
[taskMapping connectRelationship:@"assignedUser" withObjectForPrimaryKeyAttribute:@"assignedUserID"];
[objectManager.mappingProvider setMapping:taskMapping forKeyPath:@"task"];
RKManagedObjectMapping* userMapping = [RKManagedObjectMapping mappingForClass:[User class]];
[userMapping mapAttributes:@"name", @"email", nil];
[userMapping mapKeyPath:@"id" toAttribute:@"userID"];
[userMapping setPrimaryKeyAttribute:@"userID"];
[userMapping mapRelationship:@"tasks" withMapping:taskMapping];
[objectManager.mappingProvider setMapping:userMapping forKeyPath:@"user"];
// NOTE - Project is not backed by Core Data
RKObjectMapping* projectMapping = [RKObjectMapping mappingForClass:[Project class]];
[projectMapping mapKeyPath:@"id" toAttribute:@"projectID"];
[projectMapping mapAttributes:@"name", @"description", nil];
[projectMapping mapRelationship:@"user" withMapping:userMapping];
[projectMapping mapRelationship:@"tasks" withMapping:taskMapping];
[objectManager.mappingProvider setMapping:projectMapping forKeyPath:@"project"];
}
return self;
}
我做的一切都好吗? - 它不会按用户的ID将任务连接到用户。
答案 0 :(得分:2)
更新:我应该更仔细地阅读Blake's linked post - 它会更快地将我指向开发部门。
BOTTOM LINE:一对多映射问题(在User
对象的tasks
的反向水合作用的上下文中讨论)在0.9中已破坏。 3。截至2012年3月8日,开发部门的拉动证实了问题在那里得到了解决--Blake在问题#284中解决了这个问题。您执行仍需要添加示例中不包含的connectRelationship:withObjectForPrimaryKeyAttribute:
逻辑。
@Evan,感谢RKLogConfigureByName("RestKit/ObjectMapping", RKLogLevelTrace)
上的提示 - 这对于分析实际发生的事情很有帮助。
我仍然非常喜欢RestKit的“找到我的方式”阶段,所以YMMV。但是,根据this post by Blake,它实际上看起来你需要两者 - 这是我能让这个例子工作的唯一方法。但是,对相关对象的主键的引用是使用它的本地[即Task的ivar]属性引用的:
RKManagedObjectMapping* taskMapping = [RKManagedObjectMapping mappingForClass:[Task class]];
[taskMapping mapKeyPath:@"id" toAttribute:@"taskID"];
[taskMapping mapKeyPath:@"name" toAttribute:@"name"];
[taskMapping mapKeyPath:@"assigned_user_id" toAttribute:@"assignedUserID"];
taskMapping.primaryKeyAttribute = @"taskID";
RKManagedObjectMapping* userMapping = [RKManagedObjectMapping mappingForClass:[User class]];
[userMapping mapAttributes:@"name", @"email", nil];
[userMapping mapKeyPath:@"id" toAttribute:@"userID"];
[userMapping mapRelationship:@"tasks" withMapping:taskMapping];
userMapping.primaryKeyAttribute = @"userID";
[objectManager.mappingProvider setMapping:userMapping forKeyPath:@"user"];
[taskMapping mapRelationship:@"assignedUser" withMapping:userMapping];
[taskMapping connectRelationship:@"assignedUser" withObjectForPrimaryKeyAttribute:@"assignedUserID"];
[objectManager.mappingProvider setMapping:taskMapping forKeyPath:@"task"];
这是针对大约3天前的大师拉动的。
答案 1 :(得分:1)
用户 - >任务映射是在userMapping上设置的,行[userMapping mapRelationship:@"tasks" withMapping:taskMapping];
。我假设你说的是没有创建反转?
如果这是问题,我想你会发现this commit解决了这个问题,尽管我还没有尝试过。 (您可以在该点拉树,或者更好地拉动当前的主分支)。
除此之外,您对行[taskMapping connectRelationship:@"assignedUser" withObjectForPrimaryKeyAttribute:@"assignedUserID"];
有疑问。它正在搜索主键属性为“assignedUserID”的对象,但查看其他映射时,不存在此类对象。请注意,在userMapping上,主键由[userMapping setPrimaryKeyAttribute:@"userID"];
您可能想要[taskMapping connectRelationship:@"assignedUser" withObjectForPrimaryKeyAttribute:@"userID"];
,甚至更好[taskMapping mapRelationship:@"assignedUser" withMapping:userMapping];
(通过我链接的提交,我甚至不确定是否有必要添加任何内容以获得反向 - 您可以尝试两者并查看。)
如果仍有问题,您可以使用RKLogConfigureByName("RestKit/ObjectMapping", RKLogLevelTrace);
答案 2 :(得分:1)
我一直在搞这个代码差不多一个半小时,最后还是开始工作了。我采取的步骤: 1)重新排列如下关系的创建 2)取消选中RKRelationshipMappingExample.xcdatamodel>的“可选”复选标记。 task.assignedUser relationship。我注意到它既是“可选的”,也是最小值1,最大值1.我在此更改后删除了应用程序并重新安装了它。现在,用户被添加到用户的任务和任务中!
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
RKObjectManager* objectManager = [RKObjectManager objectManagerWithBaseURL:gRKCatalogBaseURL];
objectManager.objectStore = [RKManagedObjectStore objectStoreWithStoreFilename:@"RKRelationshipMappingExample.sqlite"];
RKManagedObjectMapping* taskMapping = [RKManagedObjectMapping mappingForClass:[Task class]];
[taskMapping mapKeyPath:@"id" toAttribute:@"taskID"];
[taskMapping mapKeyPath:@"name" toAttribute:@"name"];
[taskMapping mapKeyPath:@"assigned_user_id" toAttribute:@"assignedUserID"];
taskMapping.primaryKeyAttribute = @"taskID";
RKManagedObjectMapping* userMapping = [RKManagedObjectMapping mappingForClass:[User class]];
[userMapping mapAttributes:@"name", @"email", nil];
[userMapping mapKeyPath:@"id" toAttribute:@"userID"];
userMapping.primaryKeyAttribute = @"userID";
[objectManager.mappingProvider setMapping:userMapping forKeyPath:@"user"];
[objectManager.mappingProvider setMapping:taskMapping forKeyPath:@"task"];
[userMapping mapRelationship:@"tasks" withMapping:taskMapping];
[taskMapping mapRelationship:@"assignedUser" withMapping:userMapping];
[taskMapping connectRelationship:@"assignedUser" withObjectForPrimaryKeyAttribute:@"assignedUserID"];
// NOTE - Project is not backed by Core Data
RKObjectMapping* projectMapping = [RKObjectMapping mappingForClass:[Project class]];
[projectMapping mapKeyPath:@"id" toAttribute:@"projectID"];
[projectMapping mapAttributes:@"name", @"description", nil];
[projectMapping mapRelationship:@"user" withMapping:userMapping];
[projectMapping mapRelationship:@"tasks" withMapping:taskMapping];
[objectManager.mappingProvider setMapping:projectMapping forKeyPath:@"project"];
}
return self;
}
//to see NSLog messages, change the LOGGER_DEBUG to 2 (in LoggerClient.m) like this:
#define LOGGER_DEBUG 2
#ifdef NSLog
#undef NSLog
#endif
//test method to make sure all relationships are created.
- (void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects {
_objects = [objects retain];
for(Project* managedObject in objects)
{ NSLog(@" project user: %@", [managedObject.user description]);
NSLog(@"###### user tasks count: %i",[managedObject.user.tasks count]);
for(Task* task in managedObject.user.tasks)
{
NSLog(@"+++++managedObject.user.tasks: %@", [task description]);
}
for(Task* task in managedObject.tasks)
{
NSLog(@"*****task: %@", [task description]);
}
}
[self.tableView reloadData];
}