CoreData 和 RestKit
Posted
技术标签:
【中文标题】CoreData 和 RestKit【英文标题】:CoreData and RestKit 【发布时间】:2014-05-15 11:57:33 【问题描述】:我有一个关于CoreData
和RestKit
之间使用逻辑的简单问题。
我正在使用RestKit
将我的JSON
响应映射到CoreData
实体。我有一个与 cmets 的活动。
我正在发送一个请求以获取有关事件的信息,并为 cmets 发送第二个(目前)信息。
有没有办法独立于我之前的活动来映射 cmets 并在之后加入它们,或者当有映射时我是否必须将它们加入到活动中?我不知道最好的方法是什么。
在我未来的实现中,我想发送以从事件及其 cmets 中获取信息。但是我仍然想保留我的次要方法来获得 cmets 而不会获得整个事件。
"comments": [
"id": 23,
"user_id": 9,
"commentable_id": 12,
"commentable_type": "Event",
"content": "This is the content of the event",
"created_at": "2013-04-19 19:28:42.533901",
"updated_at": "2013-04-19 19:28:42.533901"
]
【问题讨论】:
你查看过 RKConnectionDescription。它允许您将 cmets 独立映射到父模型。你的 JSON 看起来如何。如果你把样品寄给我,我可能会给你答案。 我添加了一个典型的JSON
响应。如果我将这些 cmets 独立映射到父级,映射后如何将它们加入父级?无论如何,谢谢你这么快的回答。
【参考方案1】:
您可以让 RestKit 使用外键映射连接对象之间的关系(RKConnectionDescription
根据@insane-36 的评论)。如果适当的目标对象在上下文中可用,则将建立连接,如果不是,则什么也不做。
如果您不想这样做,那么您需要编写代码来复制该任务,即获取 cmets、迭代它们、获取关联事件、连接关系、保存。
让 RestKit 连接关系对您来说当然要容易得多,而且它并不排除您在没有应附加事件的情况下请求 cmets。
请注意,您可以在事件和注释映射上指定外键映射,以便在处理后一个映射时,首先加载的 RestKit 将连接到另一个。
【讨论】:
附加信息:***.com/questions/17326087/… 我知道我可以使用外键映射,但是否可以手动将关系添加到现有对象?我有类似的东西:event.comments = comments_array
其中comments_array
是我的JSON
请求和event
现有对象的新映射?基本上,当我重新加载 cmets 事件时,我真的不想重新加载整个事件。
关闭。您的托管对象子类应该有一些为关系添加的NSSet
方法。您可以从映射结果中获得的NSArray
创建一个NSSet
,并使用它来填充关系。只有在不使用外键映射时才需要它。
这意味着(就像我相信的@insane-36 所说)即使映射在时间上被分割(一个对象和之后的关系),外部映射也可以工作?我会尝试一下,如果我还有其他问题,请告诉您。谢谢!
如果您在每个映射上添加外键映射,那么您请求数据的顺序无关紧要。外键映射的全部意义在于请求是单独发出的(如果不是,您将得到一个响应并使用嵌套映射)。【参考方案2】:
假设你有上面的 JSON,你必须添加一个属性来对应特定评论所属的事件,这样我们的 json 看起来像,
"comments": [
"id": 23,
"user_id": 9,
"commentable_id": 12,
"commentable_type": "Event",
"content": "This is the content of the event",
"created_at": "2013-04-19 19:28:42.533901",
"updated_at": "2013-04-19 19:28:42.533901",
"event_id": "10", /* Note this is a new attribute to map to the parent entity */
]
现在,为您的评论模型添加一个新属性,以便存储此 event_id。我们创建一个属性eventId。
那么,让我们为实体创建映射,
RKEntityMapping *mapping = [RKEntityMapping mappingForEntityForName:@"Comment" inManagedObjectStore:[RKManagedObjectStore defaultStore]];
[mapping setIdentificationAttributes:@[@"identifier"]];
[mapping addAttributeMappingsFromDictionary:@
@"id": @"identifier",
@"updated_at": @"updatedAt",
@"created_at": @"createdAt",
@"user_id": @"userId",
@"commentable_id": @"commentableId",
@"commentable_type": @"commentableType",
@"content": @"content",
@"event_id": @"eventId"
];
然后我们必须添加连接以将 event_id 映射到正确的事件,
NSRelationshipDescription *eventRelationship = [[mapping entity] relationshipsByName][@"event"];
[mapping addConnection:[[RKConnectionDescription alloc] initWithRelationship:eventRelationship attributes:@@"eventId": @"identifier"]]; // this line says that you have to have eventId in your comments entity and then the identifier in event entity to which the eventId will be mapped to.
就是这样,您现在可以创建 RKResponseDescriptor 和 RKManagedObjectRequestOperation 来拉取评论,它将指向正确的事件。
【讨论】:
感谢您的回答。这就是好的映射。但我的主要问题是如何将其链接到现有对象。我同意这个映射是必需的。 一旦您使用此新连接描述再次获取所有 cmets,它将链接到现有事件。以上是关于CoreData 和 RestKit的主要内容,如果未能解决你的问题,请参考以下文章
Coredata 和 Mogenerator,coredata 标志并发问题 EXC_BAD_INSTRUCTION
CoreData、SourceList 和 NSTreeController
NSFetchedResultsController、CoreData、SectionIndex 和特殊字符 (Umlaute..)