【问题标题】:Beginner Core Data and Relationships初级核心数据和关系
【发布时间】:2013-10-16 16:30:06
【问题描述】:

我非常努力地了解核心数据和关系。我当前的实体设置是这样的:

个人资料>活动

我一切正常(我现在可以添加、更改和删除个人资料和事件,我只是没有关系连接)。所以基于此,我应该只需要让关系“连接”一次,对吧?当我添加一个事件时,它只需要知道要关联哪个配置文件,然后任何更改、删除等都将由核心数据处理?

如果我在正确的轨道上,我应该在哪里实现添加事件时更新配置文件?

我正在保存基于来自表视图控制器的委托的事件...

FROM THE ADD EVENT VIEW CONTROLLER


AddEventViewController.m

[self.currentEvent setEventdesc:eventDescField.text]
[self.delegate addEventViewControllerDidSave];



FROM THE EVENT TABLE VIEW CONTROLLER

EventTableViewController.m

-(void) addEventViewControllerDidSave {
  NSError *error = nil;
  NSManagedObjectContext *context = self.managedObjectContext;

    if (![context save:&error]) {
      NSLog(@"Error %@", error);
    }

   [self dismissViewControllerAnimated:YES completion: NIL];
}

【问题讨论】:

    标签: ios core-data


    【解决方案1】:

    首先,我猜你在核心数据中没有关系。 然后,你需要添加它们之间的关系:

    1. 在配置文件中与目标事件创建一个名为 eventRelation 的关系
    2. 对具有目标配置文件的配置文件 (profileRelation) 执行相同操作并设置其逆。倒数是另一个实体中的属性名称,在这种情况下,Profile 中 eventRelation 的倒数是 profileRelation。

    现在您需要更新模型的文件,将这些属性添加到它们。例如 在 Profiles.m 中添加: @property(非原子,保留)事件 * eventRelation。

    最后,在代码中,当你想保存事件关系时,你需要做:

    Profile * newProfile = (Profiles *)[NSEntityDescription insertNewObjectForEntityForName:@"Profile" inManagedObjectContext:self.managedObjectContext];
    
    Events * addEvent = (Events *)[NSEntityDescription insertNewObjectForEntityForName:@"Events" inManagedObjectContext:self.managedObjectContext];
    
    //Set event and profile data
    
    newProfile.eventRelation = addEvent;
    
    //And save changes  
    [self.managedObjectContext save:&error];
    

    现在,每次您获取实体时,您都可以使用以下方法访问另一个对象:

    //fetch data into self.profiles
    profiles.eventRelation
    

    更新示例:

    假设您有具有以下属性的实体配置文件:名称、姓氏和关系 eventRelation,以及具有属性名称、日期和关系 profileRelation 的事件实体。 然后,如果您想在事件中添加日期,您可以获取您想要的事件并执行以下操作: 事件 * 事件 ... 获取它; event.date = [NSDate ...]

    另一种选择是:您已获取个人资料,并且想要更改个人资料名称和一个事件的日期(您在该个人资料中已经有一个事件),您可以:

    Profile * profile ... fetch it
    profile.name = @"asd"
    profile.eventRelation.date = [NSDate ...];
    

    之后,你只需要保存它。

    【讨论】:

    • 好的,所以我想我可能正在考虑这个倒退..我来自传统的关系数据库背景。我正在尝试查看您上面的示例......所以我没有告诉 Event 实体它与哪个 Profile 相关,而是将 Events 对象添加到 Profile 对象中?
    • 你是对的。创建事件并将其添加到配置文件。然后,如果您获取配置文件,则可以从该属性访问事件。事件也是如此:获取事件允许您访问他们的个人资料
    • 那么在上面的例子中,我该如何添加一个事件日期(在事件实体中)?我真的很迷茫
    • 我在答案中加了一个例子
    • 太棒了。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    相关资源
    最近更新 更多