【问题标题】:Core data: any way to fetch multiple entities?核心数据:有什么方法可以获取多个实体?
【发布时间】:2011-07-03 01:08:03
【问题描述】:

我刚刚开始使用 Core Data,作为学习练习,我正在构建一个应用程序,我需要在单个表视图中显示不同类型的对象。

例如,假设我有一个“奶酪”的实体和一个不相关的“海盗”实体。在我的应用程序的主屏幕上,用户应该能够创建“Cheese”或“Pirate”实例以添加到表格视图中。

因此,使用核心数据编辑器,我为 Cheese 和 Pirate 创建了实体......但是,NSFetchRequest 似乎只允许您一次检索一种类型的实体:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Cheese" inManagedObjectContext:_context];
[fetchRequest setEntity:entity];

有没有办法执行获取所有“Cheese”和“Pirate”对象的获取?

谢谢。

【问题讨论】:

    标签: iphone ios core-data


    【解决方案1】:

    您要做的是通过在模型中定义实体继承来完成, 其中“DisplayableObject”是一个抽象类,定义为“Cheese”和“Pirate”的父类。

    然后您可以对“DisplayableObject”实体执行获取请求,它将检索两个实体的对象。

    查看苹果文档中的这篇文章:https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreData/KeyConcepts.html

    【讨论】:

    • 此解决方案的唯一问题是,如果您将所有实体(或大多数实体)设置为从抽象实体继承,Core Data 的 SQLite 实现会通过将该实体的所有实例放入同一张桌子。随着数据库的增长,这会严重降低性能。
    • 这不应该是公认的答案。这种方法效率不高,不推荐。
    【解决方案2】:

    我也必须处理这个问题。希望能够搜索多个实体,但要避免继承导致对象的层次结构全部存储在单个核心数据类中以及可能导致的性能问题。

    我选择创建一个具体的 Searchable 对象,该对象存储我要搜索的对象中常见的可搜索词。该对象已添加到我要搜索的每个类中:

    Person.Searchable
    Employee.Searchable
    Department.Searchable
    

    Searchable 具有诸如 searchTerm 之类的字段以及与我需要搜索的每个对象的许多关系。和一个 displayName 以便可以向用户显示信息,而无需查询/加载任何其他表。

    Core Data 查询是针对 Searchable 执行的,因此您只查询单个实体。

    例子:

    Person { firstName = Joe, lastName = Jackson } -> searchable { term = joejackson, displayName = Joe Jackson, type = person }
    Employee { firstName = Joe, lastName = Smith } -> searchable { term = joesmith, displayName = Joe Smith, type = employee }
    Group { name = Joe’s Development Team } -> searchable { term = joesdevelopmentteam, displayName = Joe’s Development Team, type = group }
    

    现在您可以使用单个 Fetched Request Controller 使用 Searchable 成员列出和搜索 Person、Employee、Department 所有单独的表。

    【讨论】:

    • 这本质上是一种索引形式不是吗?
    • 等等...我很困惑...这里涉及到什么关系? Searchable 有一个指向 Persons 的一对多,一个指向Employees 的一对多,一个指向Groups 的一对多,而且这些关系都没有反向关系?
    【解决方案3】:

    Tiago 的回答是有效的,但最直接的方法是执行两个单独的 fetch 请求,您可以存储在单独的 NSArrays 中或附加到一个可变数组。

    【讨论】:

    • 但是如果想使用 NSFetchResultController(OP 中没有要求)怎么办?
    • 我确实想使用 NSFetchedResultsController,因为(我相信)这可以让我为请求设置批处理大小 - 所以我不会一次将所有内容加载到内存中。此外,我希望允许用户手动重新排序表视图中的项目,所以我认为将两个单独的提取请求附加到一个数组中不会起作用。不过,我很欣赏这个答案 - 它帮助我澄清了我需要做什么。
    • 您还可以为同一个委托创建两个单独的提取结果控制器。
    • 使用来自多个 fetch 控制器的多个 fetch 会使代码过于复杂并降低性能。例如,如果有九个或更多实体,您的解决方案将很难调试和修改。定义一个抽象的父实体被引用来获取是既简单又简单的
    猜你喜欢
    • 2013-11-29
    • 2012-01-01
    • 2011-06-06
    • 1970-01-01
    • 2011-01-14
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多