无法同时添加子对象和父对象

时间:2015-11-16 12:18:09

标签: cocoa core-data nsfetchedresultscontroller nsfetchrequest

我有一个CoreData支持的应用程序,代表某种文件夹 - 层次结构。

所以文件夹可以有一个子文件夹。

因此maxsq关系父级子级

Serverside目前仅支持两级层次结构。 主文件夹 - >子目录。

但为了为未来做好准备,CoreData-Model旨在支持无穷无尽的级别。

所以关系是

NSManagedObject

该文件夹还有一个属性parent <------>> children

因此,name的格式为NSPredicate"parent != nil"的格式为NSFetchedResultsController <{1}}

现在,因为FRC不包含空部分(在此上下文中:没有子文件夹的文件夹)。我创建了一个默认的子文件夹(这个文件夹在内部使用...所以我不会搞砸用户的层次结构)。

如果用户创建新的主文件夹,我会再次执行以下操作:

parent.name

这很好但是当FRC的委托方法启动时,我会收到这个错误:

sectionNameKeyPath

看起来,FRC偶然发现了新的部分和插入的行。 但我还没有找到解决这个问题。即使我在创建并保存mainFolder之后创建并添加Folder * mainFolder = [self createNewFolderWithName:userSetName]; Folder * systemChildSubfolder = [self createNewFolderWithName:SYSTEM_SUBFOLDER_NAME]; [mainFolder addChildFolderObject:systemChildSubfolder]; [self saveContext]; ...我仍然会收到该错误。 似乎FRC仍然返回旧的部分数并尝试在错误的部分添加新行?

所以任何人都可以解释我如何让FRC像我期望的那样工作: 首先添加该部分,然后添加行?

FRC-代表:

CoreData: error: Serious application error.  An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:.  attempt to insert row 0 into section 3, but there are only 0 rows in section 3 after the update with userInfo (null)

简短更新:

我怀疑FRC不会为新父母更新,尽管它有一个子文件夹。

但新子项的更新具有正确的IndexPath(如果它的父级位于FRC中),但它不适合存储在FRC中的内容。

1 个答案:

答案 0 :(得分:0)

两个级别

正如评论中指出的那样,您的设置不可能超过两个级别。因为您只想处理父母和孩子,我建议使用以下简单的解决方案:

创建两个实体MainFolderSubFolder。如果您愿意,可以拥有类型Folder的抽象父实体,但这不是绝对必要的。

MainFolder (subFolders) <------>> (mainFolder) SubFolder

获取SubFolders并使用mainFolder作为`sectionNameKeyPath。

那就是它,不可能更简单。

无限级别

如果要实现可能无限的层次结构,则应该在使用此设置后才能提出新问题。

提示:您只有一种实体Folder,它也有一个属性level。创建文件夹并设置parent时,您需要检查level并将自己的level设置为父级{1}。层次结构中上下的关系将是 reflexive ,即引用相同的Folder实体。

在FRC中,您将在没有sectionNameKeyPath的情况下获取父级(通过基于级别的谓词),对于该部分使用objectAtIndexPath,并根据{{1}填充部分下方的行}在相应的表格视图folder.children方法(datasourcenumberOfRowsInSection)中。