coredata中的抽象实体和父关系(NSFetchedResultsController + UITableView)

时间:2012-03-09 19:48:55

标签: ios database-design core-data nsfetchedresultscontroller entities

我正在开发一个iOS应用程序,模型很简单(文件夹和文档),但是我在使用NSFetchedResultsController时遇到了问题。

该应用程序使用NavigationController中的UITableView来显示文件夹中包含的文件夹和文档的列表。用户可以使用向下钻取效果浏览文件夹层次结构。此外,用户可以复制/粘贴文件夹和文档,因此任何文档或文件夹都可以有许多父母。

这是我目前的模特:

AbstractElement{
    elementName:string
}

Folder{
    parents<<---->>Folder.folders
    folders<<---->>Folder.parents
    documents<<---->>Document.parents
}

Document{
    numPages:int
    parents<<---->>Folder.documents
}

如果我使用从当前文件夹创建的NSArray填充UITableView,此模型可以正常工作:

NSArray * currentListOfElements = 
      [[self.currentFolder.documents sortedArrayUsingDescriptors:descriptors] 
      arrayByAddingObjectsFromArray:
      [self.currentFolder.folders sortedArrayUsingDescriptors:descriptors]];

问题是我需要从NSFetchedResultsController填充UITableView,使用单个NSFetchRequest获取文件夹和文档。解决方案是这样的:

NSEntityDescription *entity = [NSEntityDescription 
                               entityForName:@"AbstractElement" inManagedObjectContext:self.context];
[fetchRequest setEntity:entity];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"%@ IN self.parents", self.currentFolder]];

...create the NSFetchedResultsController using fetchRequest...

但这不起作用,因为AbstractElement没有“父母”关系。

如果我将父关系从Folder and Document移到AbstractElement,问题是如何设置反向关系:

AbstractElement{
    elementName:string
    parents<<---->> ??
}

Folder{
    folders<<---->>Folder.parents
    documents<<---->>Document.parents
}

Document{
    numPages:int
}

这是正确的方法吗?我如何在我的模型中使用NSFetchedResultsController?我不想删除反向关系,因为我需要实现额外的代码。

感谢。

1 个答案:

答案 0 :(得分:0)

Louissmr,

你说,

  

...用户可以复制/粘贴文件夹和文档,所以任何文件或   文件夹可以有很多父母。

因此,AbstractElement中有2对多的关系有什么问题。称他们为parentschildren。它符合您的标准。每个都是另一个的倒数。

安德鲁