核心数据:获取多个实体的任何方式?

Jim*_*des 21 iphone core-data ios

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

举个例子,假设我有一个"奶酪"的实体和一个与"海盗"无关的实体.在我的应用程序的主屏幕,用户应该能够创建无论是"奶酪"或"海盗"的实例添加到表视图.

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

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Cheese" inManagedObjectContext:_context];
[fetchRequest setEntity:entity];
Run Code Online (Sandbox Code Playgroud)

有没有办法执行检索所有"奶酪"和"海盗"对象的提取?

谢谢.

Tia*_*ins 30

您要做的是通过在模型中定义实体继承来实现,其中"DisplayableObject"将是定义为"Cheese"和"Pirate"的父级的抽象类.

然后,您可以在"DisplayableObject"实体上执行获取请求,它将检索两个实体的对象.

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

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

小智 13

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

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

Person.Searchable
Employee.Searchable
Department.Searchable
Run Code Online (Sandbox Code Playgroud)

Searchable在searchTerm中有一些字段,并且与我需要搜索的每个对象有许多关系.和displayName,以便可以向用户显示信息,而无需查询/加载任何其他表.

核心数据查询针对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 }
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用单个Fetched Request Controller使用其可搜索成员列出并搜索Person,Employee,Department所有单独的表.