我有一个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中的内容。
答案 0 :(得分:0)
正如评论中指出的那样,您的设置不可能超过两个级别。因为您只想处理父母和孩子,我建议使用以下简单的解决方案:
创建两个实体MainFolder
和SubFolder
。如果您愿意,可以拥有类型Folder
的抽象父实体,但这不是绝对必要的。
MainFolder (subFolders) <------>> (mainFolder) SubFolder
获取SubFolders
并使用mainFolder
作为`sectionNameKeyPath。
那就是它,不可能更简单。
如果要实现可能无限的层次结构,则应该在使用此设置后才能提出新问题。
提示:您只有一种实体Folder
,它也有一个属性level
。创建文件夹并设置parent
时,您需要检查level
并将自己的level
设置为父级{1}。层次结构中上下的关系将是 reflexive ,即引用相同的Folder
实体。
在FRC中,您将在没有sectionNameKeyPath
的情况下获取父级(通过基于级别的谓词),对于该部分使用objectAtIndexPath
,并根据{{1}填充部分下方的行}在相应的表格视图folder.children
方法(datasource
和numberOfRowsInSection
)中。