核心数据 - 访问多对多关系中的实例与获取请求?

时间:2013-03-29 13:41:55

标签: ios objective-c core-data database-performance

我的应用中有一个核心数据模型,带有'Notebook'实体。 我可以通过两种方式访问​​一个或多个“Notebook”实例:

  • 执行带有谓词的NSFetchRequest,询问具有特定“标题”或“索引”属性的实例。
  • 通过在我的核心数据模型中添加'AppData'实体,放弃'Notebook'中的'index'属性,而是从'AppData'到'Notebook'具有多对多的有序关系。然后我会在第一个应用程序启动时创建一个'AppData'实例(在每次启动之后我将获取一个且仅有'AppData'实例的请求)并通过其多对多关系访问所有'Notebook'实例。要按标题访问笔记本,我会使用indexOfObjectPassingTest或快速obj-c枚举,通过索引访问我会使用objectAtIndex。

查询“AppData”实例的“Notebook”实例及其属性比每次设置对托管对象上下文的获取请求要容易得多。

但是,哪种方法会更快?一种方法会使用更多内存还是留在内存中的时间更长?我读到很多关系中的对象是懒惰加载的,但是什么时候会加载该组中的对象?什么时候卸货?

1 个答案:

答案 0 :(得分:2)

AppData实体似乎多余。您必须先获取它,所以为什么不取而代之前获取所有Notebook个实例?在两种情况下,过滤(按标题,其他ID属性)都是相同的。

获取请求不一定非常痛苦:

NSFetchRequest *fetch = [NSFetchRequest fetchRequestWithEntityName:@"Notebook"];
NSArray *fetchedObjects = [moc executeFetchRequest:fetch error:nil];

此外,根据您可以在内存中过滤这些内容的数据量,或者在获取请求中包含谓词。

当然,无论情况如何,都放弃了对“索引属性”的想法。核心数据是对象图,而不是数据库。唯一的理由是,如果您需要与使用唯一标识符的某个外部框架或数据存储同步。

为方便起见,您可以在托管对象的类别中创建方法。

+(NSArray*) appNotebooks {
   NSArray * fetchedResults = // fetch the appropriate entities
   return fetchedResults;
}

然后你会像这样使用它:

Notebook.appNotebooks;