1

我正在做一个项目,其中一个对象有故事源。但是,就像 Facebook 或任何其他社交网络一样,这些提要对象可以引用各种对象类型(事件、状态更新等)。我想弄清楚的是如何将它存储在 CoreData 中。

目前我已经设置好了,所以一个 Group 实体有很多 Story 对象。但是,我遇到困难的是故事对象。这是我目前拥有的:

Story
---------
objectId   (the ID of the object being referenced)
objectType (Event, Status, etc)
createdAt 
updatedAt
metaData <-- This is what I'm trying to figure out

一个事件可能有诸如“attendeeCount”之类的数据,而状态更新只有“文本”。我一直在考虑的两个选项是:

  1. 存储一个序列化的 NSDictionary 对象来存储元数据,或者
  2. 创建一个子类实体

1 听起来对我来说是更有吸引力的解决方案,但我想听听有一周以上 CoreData 经验的人的意见:) 我目前不需要搜索实际的提要项目,只需按日期对它们进行排序并显示它们。

4

1 回答 1

1

您可以使用所有 Story 对象都具有的基本参数创建抽象实体 Story。您可以创建其他具体实体,例如事件、具有特定字段的状态更新,并将这些具体实体的父实体参数设置为 Story。通过这种方式,具体实体继承了抽象 Story 实体的所有字段。

(您可以在 Utilities -> Data Model Inspector 中设置抽象实体和父实体参数)。

因此,您的实体将拥有清晰易读的界面。您还可以在 tableView 中获取并显示所有实体,在获取请求中指定“Story”实体。

编辑

是的,您可以设置从组到故事的多对多关系。例如

在此处输入图像描述

您可以像这样添加事件和状态实体:

    Group *grp = [NSEntityDescription insertNewObjectForEntityForName:@"Group" inManagedObjectContext:self.managedObjectContext];
    grp.goupID = @(12);

    Event *event = [NSEntityDescription insertNewObjectForEntityForName:@"Event" inManagedObjectContext:self.managedObjectContext];
    event.storyID = @(123);

    Status *status = [NSEntityDescription insertNewObjectForEntityForName:@"Status" inManagedObjectContext:self.managedObjectContext];
    status.storyID = @(1);

    [grp addStoriesObject:event];
    [grp addStoriesObject:status];

    NSLog(@"group stories %@", grp.stories);

日志结果:

2013-07-03 23:14:03.706 crdtTest[85418:c07] group stories Relationship 'stories' on managed object (0x74b1f50) <Group: 0x74b1f50> (entity: Group; id: 0x74b1fa0 <x-coredata:///Group/t119EA6E0-0B3B-42EB-AB33-1553CE34ABA42> ; data: {
    goupID = 12;
    stories =     (
        "0x816e720 <x-coredata:///Status/t119EA6E0-0B3B-42EB-AB33-1553CE34ABA44>",
        "0x816d980 <x-coredata:///Event/t119EA6E0-0B3B-42EB-AB33-1553CE34ABA43>"
    );
}) with objects {(
    <Status: 0x816e6d0> (entity: Status; id: 0x816e720 <x-coredata:///Status/t119EA6E0-0B3B-42EB-AB33-1553CE34ABA44> ; data: {
    group = "0x74b1fa0 <x-coredata:///Group/t119EA6E0-0B3B-42EB-AB33-1553CE34ABA42>";
    storyID = 1;
}),
    <Event: 0x816d930> (entity: Event; id: 0x816d980 <x-coredata:///Event/t119EA6E0-0B3B-42EB-AB33-1553CE34ABA43> ; data: {
    eventDate = nil;
    group = "0x74b1fa0 <x-coredata:///Group/t119EA6E0-0B3B-42EB-AB33-1553CE34ABA42>";
    storyID = 123;
})
)}
于 2013-07-03T18:57:29.303 回答