使用 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
与名为 basicModel
的 BasicModel
实体具有一对一的关系。此外,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
中的值 RegisteredUser
在BasicModel
中使用uniqueID
。
所以,需要更改的是basicModel
。您需要向RegisteredUser
实体添加一个属性,例如basicModelId
。它可以是暂时的。将其添加到RegisteredUser
映射并在RKConnectionDescription
中使用basicModelId
。
【讨论】:
我明白了,我必须为我的对象拥有的每个关系定义一个属性,这似乎有点愚蠢。你知道属性的用途是什么吗?如果我只使用嵌套字典方法,我就有能力改变我的 REST API。我还可以使用嵌套对象的外键来映射 CoreData 中的对象吗?非常感谢您的帮助! 这就是外键映射的工作方式,因此并非适用于所有关系。如果你有嵌套的 JSON,那么你就不需要外键映射。 嗯,那么如果我使用嵌套 JSON 并且只在嵌套 JSON 中包含“uniqueID”字段,那么所有其他字段是否会被假定为 null 并在 CoreData 中被覆盖?还是只会更新我在 JSON 中包含的属性? 默认情况下它只会更新那里的数据。您需要设置一个标志以取消不存在的键值。 漂亮!非常感谢,这正是我想要的。以上是关于使用 initWithRelationship:attributes 创建 RKConnectionDescription 时出现异常:的主要内容,如果未能解决你的问题,请参考以下文章
在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?
Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)