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

时间:2010-11-19 23:36:19

标签: core-data data-modeling

我有一些问题,我一直在努力为自己解答(通过阅读文档),但我有一种感觉,我错过了一些东西。

非常感谢任何提示(和/或指向适当文档的提示)。

我正在构建基于Core Data文档的应用程序。基本上有两个实体:

每个文档都有一个“比较”记录。    每个文档都可能存在许多“节点”记录。

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

如果比较实体实际上是正确的方法,我的下一个问题是如何以及何时实际实例化(单个)比较对象。用户不必明确地“添加”比较,因为只有其中一个与文档相关联。相反,应该实例化一个比较对象并将其插入到managedObjectContext中。我已经有了这样的工作,MyDocument.m中的代码看起来像这样:

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

但是 - 如果用户创建了一个新文档但从未对其进行过任何操作 - 例如,如果他立即单击关闭按钮 - 那么就不应该要求他“保存”文档。只有在他真正输入任何信息时,才应要求他保存他的作品。有没有一种首选的方法来实现这种行为?

4 个答案:

答案 0 :(得分:1)

我在遇到完全相同的问题的同时找到了这个帖子。我在我的基于文档的Core Data应用程序中有一个Entity_A表,但是我需要弄清楚如何处理Entity_B的每个文档所需的单实例。

我找到了似乎有用的东西。可能有更好的方法,但这让我现在已经超越了这个障碍。

当加载文档的xib时,我只需检查是否已创建Entity_B。如果没有,我创建一个并初始化其属性。

    - (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"];
        }
    }

答案 1 :(得分:0)

我没有正确地将该代码段插入到原始帖子中。再试一次:

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

答案 2 :(得分:0)

关于建模的问题不是很明确,请您详细说明您的“比较”实体应该做什么以及您分配给它的属性是什么?看到你的“文档”实体结构会很方便,所以我们可以提供一些有用的输入。

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

if ([documentObject isUpdated]) {
...
}

此处的文档中提供了更多详细信息http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObject_Class/Reference/NSManagedObject.html#//apple_ref/occ/cl/NSManagedObject

干杯, ROG

答案 3 :(得分:0)

实际上没有“文档”实体,我只是使用该术语来引用用户调用“保存”菜单项时保存的整个文档。也许有更好的方式来参考这个概念? NSPersistentDocument?

备份......应用程序的核心思想是比较两个分层目录结构(视觉递归“差异”)。

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

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

第二个问题实际上应该在什么时候将单个“比较”对象实例化并插入到managedObjectContext中,即哪种方法最适合实现?

最后如果“比较”对象被自动实例化(在awakeFromNib时,也许?)但是用户决定不继续,只需单击关闭按钮,就不会提示他保存(对吗?)会是什么完成这个的适当方法? documentObject似乎已更新,因为“空”比较对象实际上已在启动时自动插入,但用户尚未对其进行修改。

希望明白......谢谢。