实体内的父子关系

时间:2014-05-15 14:17:16

标签: ios objective-c core-data

我使用this演示核心数据iOS应用来帮助构建我自己的应用程序,因为它在表格视图单元格中实现了拖放功能。该应用程序似乎只是为了演示如何实现拖放而创建的。但是,该应用程序执行了我在用于开始使用api的任何核心数据教程中所做的一些事情。在数据模型(参见图像)中,它在单个实体(事件)enter image description here中设置父子关系。

在MasterViewController中,它还设置了一个rootObject

@property (strong, nonatomic) NSManagedObject *rootObject;

然后,当它设置其获取谓词时,它引用" subItems"在rootObject上,正如您从图像中看到的那样,子项目位于实体的父/子关系中

- (NSPredicate *) fetchPredicate
{

    NSMutableSet* relationship = [self.rootObject mutableSetValueForKey:@"subItems"];
    return [NSPredicate predicateWithFormat:@"self in %@",relationship];
}

当他检查根对象是否存在时,另一个重要的代码可能是插入新对象方法。注意,每次向tableView

添加新对象时都会运行log语句
if (self.rootObject) {
    NSLog(@"rootObject exists");

    NSMutableSet* relationship = [self.rootObject mutableSetValueForKey:@"subItems"];

    NSManagedObject *lastObject = [self.fetchedResultsController.fetchedObjects lastObject];
    double lastObjectDisplayOrder = [[lastObject valueForKey:@"displayOrder"] doubleValue];
    [newManagedObject setValue:[NSNumber numberWithDouble:lastObjectDisplayOrder + 1.0] forKey:@"displayOrder"];

    [relationship addObject:newManagedObject];
}

[self saveContext];

你能解释一下

吗?

a)发生了什么/为什么有必要/在实体内建立这种关系的目的是什么?

b)假设它是相关的,为什么作者会将NSManagedObject声明为rootObject?我见过的所有核心数据演示都没有实际声明NSManagedObjects。例如,xCode中的主/详细模板只是声明,它为您提供了一个基本的核心数据项目

@property (strong, nonatomic) NSFetchedResultsController *fetchedResultsController;
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;

1 个答案:

答案 0 :(得分:0)

  

发生了什么/为什么有必要/在实体内建立这种关系的目的是什么?

这不是必需的,它只是一个示例,也是使用最小Core Data模型为主 - 详细信息界面创建层次结构的简单方法

  

假设它是相关的,为什么作者可以将NSManagedObject声明为rootObject?

这是创建一个'主人的简单方法。宾语。通常是' master'或者' root'对象将由上下文中唯一的parent == nil

对象定义
  

我见过的所有核心数据演示都没有实际声明NSManagedObjects。

这并不意味着什么。应用程序通常会暂时保存指向托管对象实例的指针。实际上,获取的请求控制器可以在任何时候保存多个指向对象的指针。

  

例如,xCode中的主/详细模板只是声明,它为您提供了一个基本的核心数据项目

Apple的例子并不是最好的。该模板还拥有拥有核心数据堆栈的app委托,这是一个糟糕的决定......

除了:

谓词可以通过使用向后关系更好地使用关系。即,而不是加载子关系并检查内容,它应该引用父级并检查是否相等:

@"parent == %@", selectedParent