【问题标题】:Can you retrieve partial data (select specific columns instead of the entire row) from Core Data?您可以从 Core Data 中检索部分数据(选择特定列而不是整行)吗?
【发布时间】:2010-08-01 17:35:12
【问题描述】:

Core Data 是否允许生成诸如 select FirstName, LastName from Employee 之类的语句,而不是整个行?

在部门/员工的示例中,假设我想编写一个导航控制器样式的应用程序来显示可用的部门,并在单击时显示该部门中可用的员工。让我们假设 Employee 对象无论出于何种原因都很大。我不明白为什么我需要在EmployeesViewController 中检索大量对象只是为了在列表视图中显示它们的名称。无论如何我可以为给定部门中的所有员工请求名称字段(可能是两个:名字,姓氏)?

【问题讨论】:

  • 这将帮助您长期不从 SQL 表、行和列的角度考虑 Core Data。 Core Data 是一个对象图管理系统,旨在处理活动对象之间的复杂交互。如果您尝试使用有限的 SQL 范例,您将失去其大部分功能。

标签: core-data


【解决方案1】:

顺便说一句:

提防过早优化的危险。您不应该费心尝试调整 fetch,除非您已经测试并发现裸骨 fetch 实际上是一个问题。 Core Data 在底层进行了大量优化,使其比乍看之下更高效。在大多数情况下,调整 fetch 完全是浪费时间。

如果您有一个显示数千个对象的表,那么您通常在任何时候内存中都只有几十个活动对象。默认情况下,Core Data 将对象作为故障获取,即没有加载其属性值的对象的幽灵。只有当您访问特定对象的特定属性时,该对象才会完全加载到内存中。

如果您具有 SQL 背景,您可能习惯于手动处理从 SQL 创建的对象。 Core Data 为您处理所有这些,并且比您手动执行的效率高得多。您直观地假设您使用 SQL 开发的关于您需要做的手动优化程度在应用于 Core Data 时将是遥不可及的。

相反,请先选择最简单和最容易的方法,然后仅在您测试并发现瓶颈时进行优化。大多数时候,你会发现你为优化而烦恼是完全没有根据的。

【讨论】:

    【解决方案2】:

    如果您的员工对象非常大,并且加载它的成本太高,请考虑使用一对一的关系对其进行分区。如果您有如下字段列表:

    Employee:
        id
        name
        SSN
        DOB
        home_address
        home_phone
        department
        office_number
        office_phone
        manager
        job_title
        salary_class
        start_date
        ...
    

    你可以把它分解成:

        Employee
            id
            department
            manager
            ...
        EmployeePersonalInfo
            employee_id
            SSN
            DOB
            home_address
            home_phone
        EmployeeJobDescription
            employee_id
            job_title
            start_date
            salary_class
    

    等等。对于最常见的对象,将获取的数据限制在最相关和最常访问的字段是一种很好的做法。

    【讨论】:

      【解决方案3】:

      是的。使用-[NSFetchRequest setPropertiesToFetch:]。不过,仅适用于 iOS 3 和 OS X 10.6 及更高版本。

      【讨论】:

      • Seamus 的建议也不错。如果您的数据集非常大,并且您对裸 sql 感到满意,那么使用 sql 可能会更容易。
      • 谢谢 Yuji,我刚试过,这正是我需要的!
      猜你喜欢
      • 1970-01-01
      • 2015-09-29
      • 2012-07-03
      • 2012-05-04
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      • 2015-06-27
      • 1970-01-01
      相关资源
      最近更新 更多