Core Data中的新子对象创建“ghost”父级?

时间:2012-03-03 00:09:48

标签: objective-c ios core-data uiscrollview nsmanagedobject

我有一个名为Notebook的父实体,它与Page实体有很多关系。 我有一个滚动视图显示我的所有Notebook对象及其封面,我有一个带视图控制器的模态segue,通过导航按钮添加一个新的笔记本对象。当我在这个add-notebook-viewcontroller中使用保存按钮时,一切顺利,我发现自己在我的滚动视图中使用了新笔记本。

现在我尝试通过在保存按钮操作方法中调用此方法来添加笔记本的第一页:

- (void) addFirstPage {
    Page *newPage = (Page *)[NSEntityDescription insertNewObjectForEntityForName:@"Page" inManagedObjectContext:self.managedObjectContext]; 
    NSNumber *number = [NSNumber numberWithInt:1];
    newPage.pageNumber = number;
    newPage.toNotebook = aNewNotebook;
    NSBundle *bundle = [NSBundle mainBundle];
    NSURL *indexFileURL = [bundle URLForResource:@"index" withExtension:@"html"];
    newPage.page123andABC = [NSString stringWithContentsOfURL:indexFileURL usedEncoding:Nil error:Nil]; 
    NSError *error;
    if (![self.managedObjectContext save:&error])
        NSLog(@"Failed to add the first page: %@", [error domain]);
}

如您所见,我将新页面的笔记本设置为我的新笔记本(aNewNotebook)。 此时如果我按下模态视图中的保存按钮,我会看到滚动视图:

A)像往常一样添加了我的笔记本封面,就像列表中的最后一个笔记本一样(它们按创建日期属性排序)。

B)我在滚动视图的开头有一个空白区域,好像我在那里有第二个笔记本。如果我添加多个笔记本,则在scrollview的开头会有与笔记本一样多的空白空间。

我已经尝试删除分配给页面的笔记本,然后分配我自己的(aNewNotebook)以防自动创建一个笔记本,但它给了我错误,我试图删除nil。

因此,我就像添加两个笔记本(一个没有creationDate设置 - 与出现在scrollView开头的事实一致,确实我将creationDate设置为aNewNotebook;第二个是aNewNotebook)。 但它也像我只有一个,因为如果我试图删除不需要的一个,它说它不存在。

请帮助 - 非常感谢: - )

更新:

我尝试在addFirstPage方法中一次添加两个页面对象,并且我一直在我的scrollview中找到两个新的void notebook空间。

另外,我在添加一页后立即使用NSLog输出笔记本的数量,得到了2个笔记本的结果 - 我刚添加的笔记本和添加新页面对象时自动添加的笔记本。所以笔记本的数量与我在scrollView中看到的一致。

有什么想法吗?

感觉就像黑客一样的临时解决方案:

在我的addFirstPage方法中 - 在我创建页面之后,在我保存之前,我添加了此代码以删除没有creationDate的唯一笔记本 - 这是通过添加新页面自动创建的笔记本:

 NSMutableArray *notebooksToDelete = [CoreDataHelper searchObjectsForEntity:@"Notebook" withPredicate:[NSPredicate predicateWithFormat:@"creationDate == %@", nil] andSortKey:@"creationDate" andSortAscending:YES andContext:managedObjectContext];

Notebook *toDelete = [notebooksToDelete objectAtIndex:0];

[managedObjectContext deleteObject:toDelete];

我对此解决方案并不满意所以请随时提出改进建议。

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,发现问题是由数据模型中的子实体声明父实体引起的。一旦我删除了父实体,问题就消失了。

答案 1 :(得分:0)

到目前为止所揭示的唯一逻辑解释是,在滚动视图中,您必须在某个时刻引用Page个对象来计算滚动视图内容,而不是Notebook对象。视图控制器源文件中的快速文本搜索将揭示罪魁祸首。

确保在退出创建笔记本视图控制器之前记录所述笔记本的页数。另外,请确保您没有在滚动视图控制器中使用Page实体。