CoreData 和 RestKit

Posted

技术标签:

【中文标题】CoreData 和 RestKit【英文标题】:CoreData and RestKit 【发布时间】:2014-05-15 11:57:33 【问题描述】:

我有一个关于CoreDataRestKit 之间使用逻辑的简单问题。

我正在使用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

RestKit 和 Coredata

Coredata — 入门使用

NSFetchedResultsController、CoreData、SectionIndex 和特殊字符 (Umlaute..)

CoreData 和 RestKit