我正在使用NSFetchedResultsController
分组,其中sectionNameKeyPath
符合类别。
我的分类是:成人,儿童,视力,无。
升序排序:成人,儿童,无,视力
降序排序:视觉,无,儿童,成人
我希望无论排序顺序如何,我都希望无类别。
升序所需类别:成人,儿童,视力,无
降序所需类别:视觉,儿童,成人,无
使用的代码如下:
let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: managedOC, sectionNameKeyPath: "category", cacheName: nil)
答案 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.ascOrder
或category.descOrder
对对象进行排序,并指定相应的sectionNameKeyPath
。
结果将是您的表格将被分组并正确排序。但是,由于sectionNameKeyPath
为ascOrder
(或descOrder
),因此name
部分属性为1,2,3或4,而不是"成人&# 34;," Child"等。要解决此问题,请在tableView的titleForHeaderInSection
或viewForHeaderInSection
方法中使用:
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
如果使用索引,索引标题可能会出现类似问题。
如果您的应用已经上线,则此方法的一个缺点是需要进行数据迁移。我无法记住轻量级迁移是否可以使用与新实体的关系来替换属性。我留给你调查。