CoreData 或单个文件 (iOS)

Posted

技术标签:

【中文标题】CoreData 或单个文件 (iOS)【英文标题】:CoreData or Individual Files (iOS) 【发布时间】:2010-09-10 10:35:59 【问题描述】:

我有一个小难题:使用直接文件管理还是使用 CoreData SQLite 数据库更好?

这是我的场景:

我有一堆“用户”对象,每个对象都有一个“发布”对象列表。这在 CoreData 中很容易完成,而且非常棒 - 但是,“post”对象是从 Web 服务器下载的,它们每个都有一个唯一的标识符。我不想有多个具有相同 ID 的“发布”对象。我可以通过将 CoreData 响应缓存到 NSDictionary 中来解决这个问题,但这不适用于应用程序的设计模式。据我所知,在向我的 CoreData NSManagedObjectContext 添加新的“帖子”时,我必须查找唯一 ID 以检查其是否存在(快),如果不存在则添加它(慢),然后更新前一个如果是(快)。这有效地取代了它。你们会怎么处理呢?

我这几天一直在尝试考虑替代方案,但无论我怎么看,CoreData 都会比我的替代方案慢:

ios 应用程序的 Caches/ 目录中的文件架构可以解决这个问题。像这样的:

用户/ 唯一 ID.user 唯一 ID.user 帖子/ 唯一 ID.post 唯一 ID.post

然后,当检索 post 对象或 user 对象时,我可以检查文件是否存在数据,并将文件内容缓存在 NSDictionary 中。如果 ID 存在于字典中,则从那里检索它。替换之前的 'user' 和 'post' 对象就像覆盖文件和更新缓存一样简单。

我的第二个选择显然会更快 - 但是,我不会利用 CoreData 内置的任何效率,并且我必须提供自己的内存管理方案来在发生内存警告时清除我的缓存字典。

CoreData 中是否有某种“独特”的方式?那将解决我的问题。类似于在普通 SQLite 数据库中使用主键。

我将开始进行测试以验证这两种方法的速度,但我想我会在开始之前将其发布在这里,以防有人有更好的解决方案。

【问题讨论】:

【参考方案1】:

这个确切的问题出现了很多。

您可以在不读取整个对象的情况下检查 Core Data 中是否存在值。只需将 fetch 设置为获取您要测试的特定属性,在本例中为 ID,然后将 fetch 作为字典返回。提供一个查找一个或多个 ID 的谓词,如果返回的字典有值,那么您知道您有现有的对象。

您最终会得到一个比 Core Data 更快、更健壮的自定义系统是非常罕见的。很少值得尝试。

请记住,过早的优化是万恶之源。所有这些工作都建立在最简单的 Core Data 实现是慢的前提下。您是否实际测试过它会变慢?如果没有,请在尝试更精细的设计之前这样做。

【讨论】:

感谢您的提示。让我朝着正确的方向前进! CoreData 比我预期的要快很多。 @TechZen,实际上是在寻找这个。谢谢。【参考方案2】:

经过测试,我发现 CoreData 所用的时间至少减少了一半。我正在运行的测试如下:我在一个空的 CoreData 对象图中添加了 1000 个帖子;然后检索其中 100 个对象进行更新。添加对象的时间为0.069s,检索对象的时间为0.181s。我在 3G iPad 设备上检索了这些值。使用文件,添加这些对象的时间要长 10 倍,检索它们的时间要长 4 倍。

我的建议:坚持使用 CoreData!

【讨论】:

以上是关于CoreData 或单个文件 (iOS)的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何向 Core Data 添加单个项目? insertIntoManagedContext 或 insertNewObjectForEntityForName?

在 Core Data 中分离单个对象模型的组件

iOS 开发:我可以在 Core Data 对象中存储整数数组而不创建新表来表示数组吗?

Core Data 有时会丢失数据

iOS7 Core Data 和 iCloud 作为备份。用户的观点

Core Data 可以在 iOS 上提供哪些(如果有)ACID 保证?