0

我的应用程序中有一个带有“笔记本”实体的核心数据模型。有两种方法可以访问一个或多个“笔记本”实例:

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

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

但是,哪种方法会更快?一种方法会使用更多内存还是在内存中停留更多时间?我读到多对关系中的对象是延迟加载的,但是什么时候加载该集合中的对象?什么时候卸载?

4

1 回答 1

2

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

获取请求不必很痛苦:

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

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

当然,无论在何种情况下,都要放弃你对“索引属性”的想法。Core Data 是一个对象图,而不是数据库。这样做的唯一理由可能是您需要与某些使用唯一标识符的外部框架或数据存储同步。

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

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

然后你会像这样使用它:

Notebook.appNotebooks;
于 2013-03-29T13:57:16.107 回答