Core data 基于文档的核心数据应用程序:如何对每个文档只实例化一次的实体进行建模和控制?

Core data 基于文档的核心数据应用程序:如何对每个文档只实例化一次的实体进行建模和控制?,core-data,data-modeling,Core Data,Data Modeling,我有几个问题一直想自己回答(通过查阅文档),但我觉得我遗漏了一些东西 任何提示(和/或指向适当文档的指针)都将不胜感激 我正在构建一个基于核心数据文档的应用程序。基本上有两个实体: 每个文档都有一个单独的“比较”记录。 与每个文档关联的“节点”记录可能很多 我的第一个问题是我是否正确地思考了这个问题。由于每个文档只有一个比较对象,因此比较的属性本质上是文档本身的属性。首选的建模方法是什么(如果有) 如果比较实体实际上是正确的方法,那么我的下一个问题是如何以及何时实际实例化(单个)比较对象。用户不

我有几个问题一直想自己回答(通过查阅文档),但我觉得我遗漏了一些东西

任何提示(和/或指向适当文档的指针)都将不胜感激

我正在构建一个基于核心数据文档的应用程序。基本上有两个实体:

每个文档都有一个单独的“比较”记录。 与每个文档关联的“节点”记录可能很多

我的第一个问题是我是否正确地思考了这个问题。由于每个文档只有一个比较对象,因此比较的属性本质上是文档本身的属性。首选的建模方法是什么(如果有)

如果比较实体实际上是正确的方法,那么我的下一个问题是如何以及何时实际实例化(单个)比较对象。用户不必显式地“添加”比较,因为只有一个比较与文档关联。相反,应实例化单个比较对象并将其插入managedObjectContext。我已经有了类似的东西,MyDocument.m中的代码如下所示:

  • (void)windowController IDLOADNIB:(NSWindowController*)windowController{ [超级窗口控制器IDLOADNIB:windowController]; [NSEntityDescription insertNewObjectForEntityForName:@“比较”在managedObjectContext:managedObjectContext中]; }

但是,如果用户创建了一个新文档,但从未对其进行任何操作(例如,如果他立即单击“关闭”按钮),则不应要求他“保存”该文档。只有当他实际输入了任何信息时,才应该要求他保存他的工作。有没有更好的方法来实现这种行为?

我没有正确地将代码片段插入到原始文章中。重试:

-(void)windowControllerDidLoadNib:(NSWindowController *)windowController {
   [super windowControllerDidLoadNib:windowController];
   [NSEntityDescription insertNewObjectForEntityForName:@"Comparison" inManagedObjectContext:managedObjectContext];
}

你关于建模的问题不是很清楚,你能详细说明你的“比较”实体应该做什么,以及你给它分配了什么类型的属性吗?查看“文档”实体结构会很方便,这样我们可以提供一些有用的输入

关于第二个问题,在决定是否提示用户保存其文档之前,您可以检查NSManagedObject是否已更新:

if ([documentObject isUpdated]) {
...
}
更多详细信息请参见此处的文档

干杯, Rog

实际上没有“文档”实体,我只是用这个术语来指代当用户调用Save菜单项时保存的整个文档。也许有更好的方法来引用这个概念?你的文件是什么

备份一点。。。该应用程序的中心思想是比较两种层次目录结构(可视递归“diff”)

现在,“Comparison”实体有两个字符串属性,pathA和pathB,它们是要比较的两个目录的名称。每个“节点”实体表示正在比较的目录树中的文件名。节点实体至少包含一个属性(“relativePath”),该属性是相对于比较中指定的起点的路径

我的第一个问题是,存在一个“比较”实体是否有意义,因为只有一个实体被实例化(在用户调用“新建”菜单项之后的某个时刻)

第二个问题是,应该在什么时候实例化单个“比较”对象并将其插入managedObjectContext,即什么方法最适合实现这一点

最后,如果一个“比较”对象被自动实例化(可能是在awakeFromNib时间?),但用户决定不继续,只需单击关闭按钮,就不应该提示他保存(对吗?),那么实现这一点的合适方法是什么?documentObject看起来已经更新,因为实际上在启动时已经自动插入了一个“空”比较对象,但是用户没有修改它


希望这是清楚的。。。谢谢。

我是在为同样的问题苦苦挣扎时发现这条线索的。我在基于文档的核心数据应用程序中有一个Entity_a表,但我需要弄清楚如何处理Entity_B的每个文档所需的单个实例

我发现了一些似乎有效的方法。也许有更好的办法,但这让我暂时克服了这个障碍

加载文档的xib时,我只需检查是否创建了实体。如果没有,我创建一个并初始化它的属性

    - (void)windowControllerDidLoadNib:(NSWindowController *)aController
    {
        [super windowControllerDidLoadNib:aController];

        //has an Entity_B been created?  if not, create one.
        NSError *theError = nil;
        NSUInteger count = [[self managedObjectContext] countForFetchRequest:[NSFetchRequest fetchRequestWithEntityName:@"Entity_B"] error:&theError];

        if( count == 0 )
        {
            NSManagedObject *newEntity_B = [NSEntityDescription insertNewObjectForEntityForName:@"Entity_B" inManagedObjectContext:[self managedObjectContext]];

            [newEntity_B setValue:[NSNumber numberWithBool:YES] forKey:@"boolAttribute"];
            [newEntity_B setValue:[NSNumber numberWithInt:2] forKey:@"intAttribute"];
        }
    }