Objective c 使用SQLite store在核心数据中如何查询未保存的数据?

Objective c 使用SQLite store在核心数据中如何查询未保存的数据?,objective-c,sqlite,core-data,Objective C,Sqlite,Core Data,在发送托管对象上下文save:消息之前,对托管对象所做的修改仅在内存中,不会提交到数据库。那么它是如何对数据库执行查询的呢?它必须执行标准SQL查询,然后查询未保存的对象和合并结果,这应该非常慢 更新: 例如,我有文章标签多对多关系,我有许多未保存的文章。然后,我想找到所有的文章有一些标签或之间的一些日期。在数据库中,这将是对关系表或日期字段的查询,并将使用适当的索引。但是对于未保存的对象,它必须遍历所有未保存的文章和/或它们的标记?或者,对于未保存的对象,它还具有一些数据库,如存储?默认情况下

在发送托管对象上下文
save:
消息之前,对托管对象所做的修改仅在内存中,不会提交到数据库。那么它是如何对数据库执行查询的呢?它必须执行标准SQL查询,然后查询未保存的对象和合并结果,这应该非常慢

更新:
例如,我有文章标签多对多关系,我有许多未保存的文章。然后,我想找到所有的文章有一些标签或之间的一些日期。在数据库中,这将是对关系表或日期字段的查询,并将使用适当的索引。但是对于未保存的对象,它必须遍历所有未保存的文章和/或它们的标记?或者,对于未保存的对象,它还具有一些数据库,如存储?

默认情况下,在执行提取时,核心数据不会查询挂起的更改-您需要使用提取请求的
setIncludesPendingChanges
属性来显式设置

假设您启用了此功能:我不确定您为什么认为查询未保存的更改会更慢

如果核心数据实例由SQLite存储支持,则需要从持久存储(光盘)中读取数据库。您的未保存对象仍将在RAM中—访问这些未保存对象比访问数据库中的对象要快得多。您可以并行执行这两个查询,然后合并结果-合并数组很简单-这意味着几乎没有性能损失


所有这些都会有异常和边缘情况,但一般来说,不应该有明显的性能损失。

这是一个有趣的问题,我确实想知道当一堆对象在内存中时,大型抓取的效率有多高

我的猜测是,内存中的对象被相当智能地管理,并且对象图的设置方式使得获取请求的开销最小化。虽然如果所有对象都已写入磁盘(仅因为“双回迁”),效率可能会稍低一些,但总体而言,拥有内存层和不必不断向磁盘写入和读取的好处将大大超过这些类型的回迁请求性能的轻微下降


我认为你要想得到这个问题的答案,唯一的办法就是自己做一些分析。如果打开Instruments,iOS模拟器有一个核心数据工具,可以帮助您分析获取请求。我将测试两次执行相同的获取之间的区别:一次在获取之前处理所有挂起的更改,一次在内存中处理一组对象。如果你这样做,我很想看到两次抓取的结果

SQLite引擎是真正的数据库引擎,因此它有索引,可以执行连接等。因此,如果我们谈论的是相对大量的未保存对象,那么查询DB要比过滤没有索引的内存中对象更快,因为许多关系存储为
NSSet
s等等。顺便说一下,
setIncludesPendingChanges
默认设置为YES。啊,但是您的未保存对象几乎肯定不只是在
NSSet
中。它们将以图形的形式存储,因为这就是核心数据的全部内容,包括关于它们之间关系的信息。