iOS的Core Data限制

13

Core Data存在哪些限制?例如:表/实体中最多可以有多少行数据?数据库中可以容纳多少数据?

一般来说,是否有一份文件可以描述Core Data(用于iOS)内部存在的所有限制?

更新:关于@TechZen给出的答案,我的问题意味着我/Core Data将在后端使用sqlite。但是为了澄清一点,我打算使用sqlite,当我谈论Core Data的限制时,间接地问的是sqlite(数据库存储)的限制。

因此,在iOS环境下,除了SQLite的限制之外,Core Data是否还有其他限制?

2个回答

28

Core Data本身没有逻辑限制,仅受到内存、磁盘空间等情况的限制。然而,如果使用SQLite存储,则会受到SQLite的默认限制。如果您是为iOS编写代码,您永远不会触及这些限制。

实际上,您在使用Core Data时遇到的唯一实际限制来自于由读取大型数据块引起的内存问题,例如尝试在SQLite存储中存储图像或音频。可以通过将数据块存储在外部文件中来避免这种情况。

另外,我想提醒你,通过你提问的方式,我能感觉到你对Core Data的理解可能是错误的。

Core Data不是一个SQL的对象包装器。Core Data不是SQL。实体不是表格。对象不是行。列不是属性。Core Data是一个对象图管理系统,它可能或可能不持久化对象图,并且可能或可能不在幕后使用SQL。试图用SQL术语来思考Core Data将导致您完全误解Core Data,从而浪费时间并带来很多烦恼。


2
+1 for the aside. 我不记得我最初在哪里读到的,但是我早就学到了一条格言,如果我试图弄清楚做某事的限制,那么我就做错了。 - Philip Regan
1
@Philip Regan - 我们需要保存许多图像,所以最好现在检查它,而不是以后再考虑? - itsaboutcode
1
如果你要保存图片,最好将它们保存到文件中,并在Core Data中存储文件的URL。存储大量二进制数据最好在其他地方进行。 - paulbailey

0

Core Data是一个功能丰富、复杂的对象图管理框架,能够处理大量数据。SQLite存储可以扩展到拥有数十亿行、表和列的千兆字节大小的数据库。除非实体本身具有非常大的属性或大量属性,否则10,000个对象被认为是数据集的相当小的大小。在处理大型二进制对象时,请查看二进制大型数据对象(BLOBs)。

二进制大型数据对象(BLOBs)

如果您的应用程序使用二进制大型对象(BLOBs),例如图像和声音数据,则需要注意最小化开销。一个对象被认为是小型或中型取决于应用程序的使用情况。一般规则是,小于1兆字节的对象是小型或中型,而大于1兆字节的对象是大型。一些开发人员已经在数据库中使用了10 MB BLOBs并获得了良好的性能。另一方面,如果一个应用程序在一个表中有数百万行,即使128字节也可能是需要规范化到单独的表中的字符大型对象(CLOB)。

一般来说,如果需要在持久存储中存储BLOBs,请使用SQLite存储。其他存储需要整个对象图驻留在内存中,并且存储写入是原子性的(请参阅持久存储类型和行为),这意味着它们不能有效地处理大型数据对象。SQLite可以扩展以处理极大的数据库。正确使用,SQLite可为高达100 GB的数据库提供良好的性能,单个行可以容纳高达1 GB的数据(尽管无论存储库的效率如何,将1GB的数据读入内存都是一项昂贵的操作)。
BLOB通常表示实体的属性,例如,照片可能是Employee实体的属性。对于小到适度的BLOBs(和CLOBs),为数据创建一个单独的实体,并创建一个to-one关系以替换属性。例如,您可以创建Employee和Photograph实体,它们之间有一个一对一的关系,其中从Employee到Photograph的关系替换了Employee的照片属性。此模式最大化了对象故障的好处(请参阅故障和唯一性)。只有在实际需要时(如果遍历关系),才会检索任何给定的照片。

然而,如果您能够将BLOB作为资源存储在文件系统中,并维护到这些资源的链接(例如URL或路径),那么会更好。然后,您可以根据需要加载BLOB。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接