【问题标题】:CoreData - "join" rows from the same entityCoreData - 来自同一实体的“连接”行
【发布时间】:2014-04-13 01:07:36
【问题描述】:

我对 Core Data 很陌生,如果我只是为了更好地解释我的问题而使用 sql 术语,我想提前道歉。我确实搜索了网络,但没有以某种干净的方式找到答案。 Core Data 是否可以在搜索时从具有一些唯一“外部”ID(不是核心数据在插入时提供的ID)的同一实体中“加入”两行。例如,我有一个包含字段的表:

unique_id | description      | iso_code 
----------------------------------------
13        | some desc        | code A 
13        | some other stuff | code B 
13        | some foo         | code C

----------------------------------------
16        | some fun desc    | code A 
16        | some other stuff | code B 
16        | some foo bar     | code C

所以每一行都有相同的 13 或其他 id,我想在获取时“加入”这些相同 id 的集合,例如通过描述对这些加入的结果集进行排序 - 其中 iso_code 是代码 C。然后在表格视图中显示结果。

在运行时无需在内存中进行额外的多个数组和字典操作即可做到这一点 - 例如,获得 3 倍以上的结果,然后将它们组合到将显示的缩减过滤集合中。或者不再使用一个实体并与之建立关系。

【问题讨论】:

    标签: objective-c core-data


    【解决方案1】:

    Core Data 不是 SQLite 的包装器。 Core Data 不是关系数据库。最终结果是,Core Data 不进行连接。

    Core Data 是一个持久的对象图。您可以搜索对象图。

    您要做的是运行带有unique_id = 13 谓词的NSFetchRequest,取回实体的三个单独实例并从那里继续处理。您可以在请求上指定排序描述符来实现排序。

    您可以使用NSFetchedResultsController 自动将特定请求连接到表,而您实际上只需要编写特定的视图内容。

    编辑:至于您的其他问题,Core Data 有一个相当先进的内存管理系统,其中对象从简单的错误(如果您的持久存储是 SQLite,基本上只是一个表名 + 行号)扩展,仍然是错误但有它们的信息在 Core Data 的缓存中(SQLite 没有多线程,Core Data 有,所以它做了一些中间结果缓存)或完全存在于内存中(即所有直接附加到对象的字段)。 Core Data 将根据需要自动转到商店以转换状态*。

    (*) 尽管 SQLite 在任何现代应用程序中都是非常薄弱的​​环节,因为它具有 c.1995 单线程特性;在进行性能调整时,您通常希望强制 Core Data 进行完整提取而不是自动出错,因为否则您的主线程可能最终锁定在“后台”活动上,因为其他人拥有 SQLite 锁。显然,这取决于您的工作量以及您如何安排线程或队列。

    【讨论】:

      【解决方案2】:

      您的模型中不需要任何唯一 id,因为 Core Data 会 [自动] 提供。当您在模型中将实体链接在一起然后生成实体文件时,您会在头文件中找到类似的内容:

      @interface User (CoreDataGeneratedAccessors)
      
      - (void)addGoalObject:(Goal *)value;
      - (void)removeGoalObject:(Goal *)value;
      - (void)addGoal:(NSSet *)values;
      - (void)removeGoal:(NSSet *)values;
      
      @end
      

      在上面的示例中,有一个“用户”实体和一个“目标”实体。该模型将这些表关联起来,但作为程序员,提供连接这些表的任何关键字段不是我的问题,就像在 SQL 中所做的那样。事实上,Core Data 的功能是将模型从数据库中抽象出来,而您的代码对数据存储的格式几乎没有兴趣。因此,Core Data 将决定如何处理您所谓的“加入”。

      当您需要访问给定用户的目标时,您将通过这些访问器方法来完成,这些方法允许您通过上述方法调用访问链接到特定用户的各种实体。

      这对我来说是一个艰难的过渡,但如果你几乎从不使用 SQL,你会更好。它只是为你做所有这些事情。而且,如果您尝试使用 SQL 概念(例如提供唯一 ID),您最终会发现它会产生很多问题,却没有解决任何问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多