核心数据和连接条件后的排序

时间:2011-07-14 11:01:45

标签: ios sorting core-data

我的核心数据表中有3个表 项目表:项目,具有ID列和与属性表的连接 属性表:它有一个propertyValue列和一个到item表的连接以及一个到属性表的连接。
属性表:它有一个propertyName列和一个到属性表的连接。

属性表包含名为“price”的propertyName 属性表包含属性“price”的propertyValue“20” 你认为我可以按价格对Items表进行排序吗?

我正在使用NSFetchedResultsController,我正在为它创建一个NSFetchRequest。 我曾尝试为NSFetchRequest编写带有比较器块对象的NSSortDescriptor。它不起作用。在此之后,我尝试编写一个没有任何选择器或块对象的NSSortDescriptor,我只是设置了一个名为“dealPrice”的键,并使用一个名为- (NSString *)dealPrice的方法在Item管理对象上创建了一个类别。它既没有工作也没有。

你知道其他方法吗?或者您知道解决方案吗?

3 个答案:

答案 0 :(得分:3)

你显然遇到了SQL热病的坏情况。您尝试将Core Data视为SQL包装器,并且正在搞乱一切。

核心数据不是SQL。实体不是表格。对象不是行。属性不是列。关系不是联接。核心数据是一个对象图管理系统,可能会或可能不会持久保存对象图,并且可能会或可能不会使用远远落后的SQL来执行此操作。试图用SQL术语来思考核心数据将导致你完全误解核心数据并导致更多的悲伤和浪费时间。

不应根据UI的需要或任何其他非数据要求配置Core Data数据模型。相反,它应该准确地建模/模拟应用程序处理的现实世界对象,事件或条件。

在这种情况下,您正在建模:

  1. 一种具有名称和价格的财产。
  2. 由某种身份证明
  3. 表示的项目
  4. 一个或多个特定属性实例与一个或多个项目实例之间的关系。
  5. 因此,您的数据模型只需要通过关系连接的两个实体。您不需要“加入”,因为关系会自动处理两个实体之间的连接。

    最简单的模型只有一对一的关系:

    Item{
      id:string
      property<-->Property.item
    }
    
    Property{
      name:string
      price:number
      item<-->Item.property
    }
    

    如果每个Item对象可以包含多个关联的Property对象,那么您将拥有:

    Item{
      id:string
      properties<-->>Property.item
    }
    
    Property{
      name:string
      price:number
      item<<-->Item.properties
    }
    

    如果每个Property对象可以有多个关联的Item对象:

    Item{
      id:string
      property<<-->Property.items
    }
    
    Property{
      name:string
      price:number
      items<-->>Item.properties
    }
    

    如何配置排序描述符取决于关系的详细信息以及tableview将显示的实体对象。

答案 1 :(得分:0)

我首先建议的是停止像数据库一样考虑CoreData。它不是一个数据库。你称之为“表”的东西实际上就是实体。将它们视为对象,具有与其他对象的属性和关系。考虑让您的数据模型尽可能简单。不要尝试优化数据库性能等结构。实际的后备模式不在您的控制之下。

考虑到这一点,从您发布的有关数据模型的内容来看,您似乎应该能够折叠成至少2个实体而不是3个实体(可能是1但不确定没有看到您的整个数据模型)。然后,您应该能够对Items实体进行简单的提取,并使用谓词对其相关对象的属性进行排序。

答案 2 :(得分:0)

听起来您的真实对象模型是实体,名为交易属性名为“price”。