使用 initWithRelationship:attributes 创建 RKConnectionDescription 时出现异常:

Posted

技术标签:

【中文标题】使用 initWithRelationship:attributes 创建 RKConnectionDescription 时出现异常:【英文标题】:Exception when creating an RKConnectionDescription with initWithRelationship:attributes: 【发布时间】:2014-03-03 02:38:57 【问题描述】:

我在使用 RestKit 时遇到了一个有趣的问题。我希望能够通过它们在 CoreData 中的 uniqueID 来映射我的对象。看起来 RKConnectionDescription 应该允许我这样做。我想在 RegisteredUser 和 BasicModel 对象之间建立连接。问题是,当我创建连接时,我收到一个 NSInternalInconsistencyException,因为 RestKit 说,Cannot connect relationship: invalid attributes given for source entity 'RegisteredUser'

下面是我必须为用户创建映射的代码。

RKEntityMapping *userEntityMapping = [RKEntityMapping mappingForEntityForName:@"RegisteredUser" inManagedObjectStore:[RKManagedObjectStore defaultStore]];
[userEntityMapping addAttributeMappingsFromArray:@[@"uniqueID",
                                                   @"createdAt",
                                                   @"updatedAt",
                                                   @"firstName",
                                                   @"middleName",
                                                   @"lastName",
                                                   @"email",
                                                   @"gender",
                                                   @"dateOfBirth",
                                                   @"profileImageUpdatedAt"]];
NSEntityDescription *userEntity = [NSEntityDescription entityForName:@"RegisteredUser" inManagedObjectContext:[RKManagedObjectStore defaultStore].mainQueueManagedObjectContext];
NSRelationshipDescription *basicModelRelationship = [userEntity relationshipsByName][@"basicModel"];
RKConnectionDescription *connection = [[RKConnectionDescription alloc] initWithRelationship:basicModelRelationship attributes:@@"basicModel": @"uniqueID"];
[userEntityMapping addConnection:connection];

在核心数据中,RegisteredUser 与名为 basicModelBasicModel 实体具有一对一的关系。此外,BasicModel 实体有一个 uniqueID 属性。

据我所知,我正在根据示例here 正确创建 RKConnectionDescription。问题是当我调用initWithRelationship:attributes: 时,它断言RegisteredUser 实体上有一个basicModel 属性,当然不是。只有basicModel 关系,所以我遇到了上面描述的崩溃。

如果 RestKit 期望我为关系创建连接,为什么还要检查 RegisteredUser 是否具有属性 basicModel?我在这里错过了什么吗?

【问题讨论】:

你的 JSON 是嵌套的吗?还是按照 2 个不同的响应(外键映射)建立连接? 试图用外键映射。当请求用户时,JSON 将如下所示。 results:firstname:"Blah", lastName:"Blahblah", basicModel:3, etc...,其中 3 是 basicModel 托管对象的唯一 ID。 【参考方案1】:

使用RKConnectionDescription 是正确的,但使用它的方式是错误的。在这一行:

initWithRelationship:basicModelRelationship attributes:@@"basicModel": @"uniqueID"];

您正在告诉 RestKit 关系,但它应该使用 RegisteredUser 实体中名为 basicModel 的属性来查找要连接的 BasicModel,匹配 basicModel 中的值 RegisteredUserBasicModel 中使用uniqueID

所以,需要更改的是basicModel。您需要向RegisteredUser 实体添加一个属性,例如basicModelId。它可以是暂时的。将其添加到RegisteredUser 映射并在RKConnectionDescription 中使用basicModelId

【讨论】:

我明白了,我必须为我的对象拥有的每个关系定义一个属性,这似乎有点愚蠢。你知道属性的用途是什么吗?如果我只使用嵌套字典方法,我就有能力改变我的 REST API。我还可以使用嵌套对象的外键来映射 CoreData 中的对象吗?非常感谢您的帮助! 这就是外键映射的工作方式,因此并非适用于所有关系。如果你有嵌套的 JSON,那么你就不需要外键映射。 嗯,那么如果我使用嵌套 JSON 并且只在嵌套 JSON 中包含“uniqueID”字段,那么所有其他字段是否会被假定为 null 并在 CoreData 中被覆盖?还是只会更新我在 JSON 中包含的属性? 默认情况下它只会更新那里的数据。您需要设置一个标志以取消不存在的键值。 漂亮!非常感谢,这正是我想要的。

以上是关于使用 initWithRelationship:attributes 创建 RKConnectionDescription 时出现异常:的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)