无论NSFetchedResultsController中的sectionNameKeyPath如何,都要更改排序顺序

时间:2017-10-27 07:23:25

标签: ios swift core-data nsfetchedresultscontroller

我正在使用NSFetchedResultsController分组,其中sectionNameKeyPath符合类别。

我的分类是:成人,儿童,视力,无。

升序排序:成人,儿童,无,视力

降序排序:视觉,无,儿童,成人

我希望无论排序顺序如何,我都希望无类别。

升序所需类别:成人,儿童,视力,无

降序所需类别:视觉,儿童,成人,无

使用的代码如下:

let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: managedOC, sectionNameKeyPath: "category", cacheName: nil)

2 个答案:

答案 0 :(得分:0)

我认为因为您将类别存储为String而String值只能按字母顺序排序。 是否可以在数据库中创建数字字段?并存储数值如 成人= 1,儿童= 2,视力= 3,无= 4, 通过您可以按升序或降序轻松排列和排序数据。希望这能帮助你。

答案 1 :(得分:0)

如果您乐意修改CoreData模型,则可以创建一个新实体来表示类别。 Category实体将具有三个属性:name(字符串),ascOrder(整数16)和descOrder(整数16)。然后(作为一次性任务)创建四个Category个对象,其值如下:

name        ascOrder    descOrder
====        ========    =========
Adult       1           3
Child       2           2
Vision      3           1
None        4           4

将实体的category属性替换为与Category的(一对一)关系。反比关系应该是很多。现在,不是将属性值设置为"成人",而是将Category"成人"设置为name对象的关系。然后,您可以配置FRC以按键category.ascOrdercategory.descOrder对对象进行排序,并指定相应的sectionNameKeyPath

结果将是您的表格将被分组并正确排序。但是,由于sectionNameKeyPathascOrder(或descOrder),因此name部分属性为1,2,3或4,而不是"成人&# 34;," Child"等。要解决此问题,请在tableView的titleForHeaderInSectionviewForHeaderInSection方法中使用:

let sectionInfo = self.fetchedResultsController.sections![section]
let sectionName = sectionInfo.name

但是通过遍历该部分中第一项的关系来获取名称:

let sectionInfo = self.fetchedResultsController.sections![section]
let firstItem = sectionInfo.objects![0] as! YourEntity
let sectionName = firstItem.name

如果使用索引,索引标题可能会出现类似问题。

如果您的应用已经上线,则此方法的一个缺点是需要进行数据迁移。我无法记住轻量级迁移是否可以使用与新实体的关系来替换属性。我留给你调查。