iOS的核心数据限制

时间:2011-04-19 13:06:06

标签: database core-data ios4

核心数据是否存在任何限制?例如;表/实体中可以有多少个最大行?数据库中可以存储多少数据?

一般来说,如果某些文档可以描述Core Data(iOS)中存在的所有限制?

更新: w.r.t由@TechZen给出的回答,我的问题暗示I / Core Data将在后端使用sqlite这一事实。但是要明确这一点,我打算使用sqlite,当我谈论Core Data的限制时,我间接要求限制sqlite(数据库存储)。

当我们谈论iOS环境时,除了sqlite的limitations之外的核心数据是否有任何限制?

2 个答案:

答案 0 :(得分:23)

除了那些由情境内存,磁盘空间等强加的内容之外,对核心数据本身没有任何逻辑限制。但是,如果你使用SQLite商店,你会得到default limitations of SQLite itself.如果你正在为iOS编写,你永远不会达到了这些极限。

您使用Core Data遇到的唯一实际限制来自reading in large blobs导致的内存问题,例如尝试在SQLite存储中存储图像或音频。将blob存储在外部文件中可以避免这种情况。

顺便说一句,我会警告你,我可以通过你说出问题的方式告诉你,你正在考虑核心数据错误。

Core Data不是SQL的对象包装器。核心数据不是SQL。实体不是表格。对象不是行。列不是属性。核心数据是一个对象图管理系统,可能会或可能不会持久保存对象图,并且可能会或可能不会使用远远落后的SQL来执行此操作。试图用SQL术语来思考核心数据将导致你完全误解核心数据并导致更多的悲伤和浪费时间。

答案 1 :(得分:0)

核心数据是一个丰富而复杂的对象图管理框架,能够处理大量数据。 SQLite存储可以扩展到具有数十亿行,表和列的TB级数据库。除非您的实体本身具有非常大的属性或大量属性,否则10,000个对象被认为是数据集的相当小的大小。使用大型二进制对象时,请查看二进制大数据对象(BLOB)。

二进制大数据对象(BLOB)

如果您的应用程序使用二进制大对象(BLOB)(如图像和声音数据),则需要注意尽量减少开销。对象是小还是大取决于应用程序的用法。一般规则是小于1兆字节的对象是小型或中型的,而大于兆字节的对象是大的。一些开发人员在数据库中使用10 MB BLOB实现了良好的性能。另一方面,如果一个应用程序在表中有数百万行,那么即使128个字节也可能是一个CLOB(字符大对象),需要将其规范化为一个单独的表。

通常,如果需要将BLOB存储在持久性存储中,请使用SQLite存储。其他商店要求整个对象图驻留在内存中,并且存储写入是原子的(请参阅持久存储类型和行为),这意味着它们不能有效地处理大型数据对象。 SQLite可以扩展以处理极大的数据库。如果使用得当,SQLite可为高达100 GB的数据库提供良好的性能,单行最多可容纳1 GB(当然,无论存储库的效率如何,将1GB数据读入内存都是一项昂贵的操作)。

BLOB通常表示实体的属性 - 例如,照片可能是Employee实体的属性。对于小到适度的BLOB(和CLOB),为数据创建一个单独的实体,并创建一个一对一的关系来代替该属性。例如,您可以创建Employee和Photograph实体,它们之间具有一对一的关系,其中Employee与Photograph之间的关系取代了Employee的photograph属性。这种模式最大化了对象错误的好处(参见Faulting和Uniquing)。只有在实际需要时才会检索任何给定的照片(如果遍历关系)。

但是,如果您能够将BLOB作为资源存储在文件系统上并维护到这些资源的链接(例如URL或路径),那就更好了。然后,您可以在必要时加载BLOB。