我使用this演示核心数据iOS应用来帮助构建我自己的应用程序,因为它在表格视图单元格中实现了拖放功能。该应用程序似乎只是为了演示如何实现拖放而创建的。但是,该应用程序执行了我在用于开始使用api的任何核心数据教程中所做的一些事情。在数据模型(参见图像)中,它在单个实体(事件)中设置父子关系。
在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;
答案 0 :(得分:0)
发生了什么/为什么有必要/在实体内建立这种关系的目的是什么?
这不是必需的,它只是一个示例,也是使用最小Core Data模型为主 - 详细信息界面创建层次结构的简单方法
假设它是相关的,为什么作者可以将NSManagedObject声明为rootObject?
这是创建一个'主人的简单方法。宾语。通常是' master'或者' root'对象将由上下文中唯一的parent == nil
。
我见过的所有核心数据演示都没有实际声明NSManagedObjects。
这并不意味着什么。应用程序通常会暂时保存指向托管对象实例的指针。实际上,获取的请求控制器可以在任何时候保存多个指向对象的指针。
例如,xCode中的主/详细模板只是声明,它为您提供了一个基本的核心数据项目
Apple的例子并不是最好的。该模板还拥有拥有核心数据堆栈的app委托,这是一个糟糕的决定......
除了:
谓词可以通过使用向后关系更好地使用关系。即,而不是加载子关系并检查内容,它应该引用父级并检查是否相等:
@"parent == %@", selectedParent