【问题标题】:One to many relationship: not able to save一对多关系:无法保存
【发布时间】:2013-09-29 00:39:02
【问题描述】:

我正在尝试与我拥有的一些数据建立一对多关系。

我有一个 Project 和许多项目,我正在尝试设置控制器来保存它们,但这是我第一次使用一对多关系,我的头快要爆炸了。

这就是我的保存方法的样子

- (void)writeProj:(NSArray *)recivedProData ItemsData:(NSArray *)itemsData  {
    // WRITE TO CORE DATA
    NSManagedObjectContext *context = [self managedObjectContext];    

    for (NSDictionary *dict in recivedProData) {
    Project *project = [NSEntityDescription insertNewObjectForEntityForName:@"Project" inManagedObjectContext:self.managedObjectContext];        

        project.projectNumber = [dict valueForKey:@"ProjectNumber"];
        project.projectDescription = [dict valueForKey:@"Description"];
//        project.items = [dict valueForKey:@""]; // this is the relationship for project        
    }

    for (NSDictionary *dict in itemsData) {
    Items *items = [NSEntityDescription insertNewObjectForEntityForName:@"Items" inManagedObjectContext:self.managedObjectContext];

        items.description = [dict valueForKey:@"Description"];
        items.area = [dict valueForKey:@"Area"];
        items.stage = [dict valueForKey:@"Stage"];
//        items.project = [dict valueForKey:@""]; // this is the relationship for items                 
    }    

    NSError *error = nil;

    if (![__managedObjectContext save:&error]) {
        NSLog(@"There was an error! %@", error);
    }
    else {
        NSLog(@"created");
    }

    [Project addItemsObject:items];

    [__managedObjectContext saveOnSuccess:^{

        NSLog(@"You created a relationship");

    } onFailure:^(NSError *error) {

    NSLog(@"There was an error! %@", error);

    }];        
}

所以我有一个Project 和许多Items,我只是不知道如何设置关键字段,以便它们作为一个项目和多个项目保存到核心数据中。

所以希望我的代码是有意义的。如果有人能帮我弄清楚如何正确保存它,将不胜感激。

【问题讨论】:

    标签: ios objective-c core-data nsarray nsdictionary


    【解决方案1】:

    只需将 items.project 设置为等于您刚刚创建的项目NSManagedObject

    items.project = project;
    

    编辑:如果您只有一个项目,您应该将Project* project 声明移到recivedProData for 循环之外——您正在为每本词典制作一个项目,并且您说您只有一个项目。但是,如果您只有一个项目,那么整个代码块毫无意义——为什么您有一组 Project 数据,而不仅仅是一个字典?

    【讨论】:

    • 好的。然后将保存添加到循环中的项目中..这一切都合乎逻辑..希望它有效
    • 我认为您不需要将 saveOnSuccess: 调用放入 for 循环 - 与现在一样最后一次保存到硬盘驱动器几次而不是一次效率低下( core data 将您的更改保存在内存中,直到您关闭应用程序或丢弃它们),并记住 iOS 设备上的闪存在它们耗尽之前只会获得一定数量的写入。还是我完全误解了你写的内容?
    • 对不起,我说的不是很清楚,我说的是这行代码 [project addItemsObject:items];不是保存..保存仍然在循环之外..所以如果我使用你的 items.project = project;?
    • 哪个代码? saveOnSuccess:?如果您希望数据在您的用户关闭应用程序后仍然存在,您确实需要保留它。
    • 你知道如何将项目和相关项目读入一个数组吗?
    【解决方案2】:

    我想讨论一下您的 Core Data 模型,即您使用 Core Data GUI 编辑器配置的模型。我对以下代码行中名为“Items”的多个实体感到好奇:

    Items *items = [NSEntityDescription insertNewObjectForEntityForName:@"Items" inManagedObjectContext:self.managedObjectContext];
    

    也许这只是语义问题。然而,多个实体名称可能表明您的核心数据模型中存在问题。我会尝试解释,但这是非常抽象的东西。

    虽然一个实体可能有一个表示事物集合的关系,但实体本身并不是真正的事物集合;实体在模型中始终是单一事物,应在您的代码(和命名方案)中如此对待。

    以下是我将如何用文字描述您的模型: Project 实体是具有称为项目的关系的单个事物。项目关系是项目实体的集合(一组)(即一对多关系)。但是每个 Item 实体都是一个单一的东西。

    您在 GUI 编辑器中的模型是否反映了这种描述?

    【讨论】:

    • 我认为这解释了我在做什么。我有一个项目,其中有很多项目。项目是项目的集合。剂量有意义吗?这就是我想要实现的目标,我很确定我的数据模型是正确的,因为我从项目到项目之间存在一对多的关系。但是我只是不确定我的代码是否反映了这一点,因为我从未尝试过这样的事情之前,我依靠我在写作和阅读奇异对象方面的经验。
    • 你能从 GUI 编辑器中截取你的数据模型并发布吗?正如其他人所说,您发布的代码存在问题,但首先要确定您的模型是正确的。
    猜你喜欢
    • 2011-07-12
    • 2012-12-05
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    相关资源
    最近更新 更多