由于继承缺陷,Core Data sqlite 存储单表?

Posted

技术标签:

【中文标题】由于继承缺陷,Core Data sqlite 存储单表?【英文标题】:Core Data sqlite store single table due to inheritance drawbacks? 【发布时间】:2016-04-30 08:54:15 【问题描述】:

我有一个包含 20 个实体的核心数据模型。我希望所有实体都有共同的属性。例如,它们都具有创建日期属性。 因此我引入了一个包含所有公共属性的公共实体,所有其他实体都继承自这个公共实体。

这很好,效果很好,但是,所有实体最终都在一个 SQLite 表中(这是相当合乎逻辑的)。

我想知道这是否有任何明显的缺点? 例如,当在现实生活中每个实体有 1000 多个对象时,(单个)表会变得如此巨大以至于可能会出现可怕的性能问题吗?

【问题讨论】:

【参考方案1】:

以前有人问过这个问题:

Core Data entity inheritance --> limitations?

Core data performances: when all entities inherit from the same parent entity

Core Data inheritance vs no inheritance

另外请记住,当您想要检查 SQLite 文件以进行调试时,单独的表更容易检查。

我会使用一个通用的 NSManagedObject 子类而不是父实体。

【讨论】:

谢谢!我非常喜欢这个简单的解释:“我认为唯一需要实体继承的时候是当你需要不同的实体出现在同一个关系中时”。【参考方案2】:

不用担心这个。来自核心数据文档:

https://developer.apple.com/library/tvos/documentation/Cocoa/Conceptual/CoreData/Performance.html

... SQLite 存储可以扩展到具有数十亿行、表和列的 TB 级数据库。除非您的实体本身具有非常大的属性或大量属性,否则 10,000 个对象对于数据集来说被认为是相当小的规模。

更重要的是,如果您正在执行任何繁重的操作,例如获取大量对象,或者基于 Web 服务中的某些 JSON 解析对象,您而不是在主线程上执行此操作.这不是很难做到,查看父/子托管对象上下文以及它们如何与私有/主队列并发类型的托管上下文对象一起使用。互联网上有很多关于这个主题的好博文。

【讨论】:

嗯...不确定。来自 Apple 的文档:“使用 SQLite 持久存储时要小心实体继承。从另一个实体继承的所有实体都将存在于 SQLite 的同一个表中。SQLite 持久存储设计中的这个因素可能会产生性能问题。” (核心数据编程指南的创建托管对象部分)【参考方案3】:

2 年多来,我一直在用一个基础实体处理大约 20 个子实体和轻松总共 50k 个实例的项目。我们从未遇到过选择、插入或更新的性能问题。

在大型数据集上使用 Core Data 继承的关键是

优化的获取请求(调整谓词、排除不相关的属性、预取关系、省略子实体、设置 fetchLimit、使用字典结果类型或计数请求(如果足够)等) 批量保存(意味着每次插入后不保存MOC等) 设置适当的索引(它们可以加快选择战利品的速度) 适当地构建您的 UI,这样您就不必在一个 viewController 中加载和显示数千个对象

在导入 JSON 时,我们甚至不使用父/子 managedObjectContexts 或私有队列(它们本身会引入很多额外的复杂性),因为我们的数据模型和映射代码已经高度优化,以至于 UI 甚至没有导入几千个对象时会显着闪烁或挂起。

【讨论】:

以上是关于由于继承缺陷,Core Data sqlite 存储单表?的主要内容,如果未能解决你的问题,请参考以下文章

sqlcipher与Microsoft.Data.Sqlite.Core踩坑

是否可以为 Core Data 定制 SQLite 构建?

SQLCipher、encrypted-core-data 和 iOS - 两个 .sqlite 文件正常吗?

Core Data/SQLite 是不是压缩冗余信息?

iphone数据存储之-- Core Data的使用

加载预加载到 Core Data 中的 SQLite 数据库