多个NSFetchedResultsController用于单个表和核心数据实体设计

时间:2012-02-17 12:55:01

标签: ios core-data nsfetchedresultscontroller

我正在开发一个iPad应用程序,它存储有关在tableview中显示的位置的详细信息。用户可以通过全部(单个部分按字母顺序排序),区域明智(每个区域作为部分)和明智的类型对位置进行排序(每种类型为部分)。我为每个使用单独的NSFetchedResultController,因为初始化时必须给出'sectionNameKeyPath'。 我现在有两个问题。花了一周多的时间搜索,但我找到的解决方案产生了更多相关问题。

1)对于任何更新(例如:将位置设置为收藏),提供NSFetchedResultsChangeDelete而不是NSFetchedResultsChangeUpdate。

  • 如果我们使用多个fetchedResultController
  • ,很多论坛都说它是一个已知错误
  • 我唯一可以避免的方法是不使用委托方法并为每次更改再次获取。因此,仅仅缺少tableview动画。
  • 并非所有更新都会给委托回电。 我是以正确的方式进行还是有更好的方法可以使用单个FetchedResultController?

2)类型的tableview排序无法有效地使用FetchedResultController与当前的Entity设计。当前设计使用实体位置,类型和区域。地区的位置是一对多的关系。但是,位置到类型是两个方向上的多对多关系。 [我试图上传实体设计图片,但我的声誉不允许。]

  • 类型位置关系在两个方向都是多对多关系。所以不能给出sectionNameKeyPath,因为types是 Location 实体中的Set。所以我从类型实体获取并从中获取位置数组(集合)。
  • 所以numberOfRows可以从set计算。但是没有订购。所以我用比较器对它进行排序。 我不确定这是正确的方法,所以我要求大家就这个实体设计提出宝贵的建议。

1 个答案:

答案 0 :(得分:0)

不太确定但是,CoreData在更改通知方面有一些缺陷(这是一个很棒的独家功能)但是我发现NSFetchedResultsChangeDelete并不一定意味着一个对象已经从数据库中删除了,它表示该对象在获取的对象上不再可用,因为它已被删除或不再适合当前谓词(条件)。你应该检查一下。