2011-04-19 81 views
10

Core Data中是否存在任何限制?例如;一个表/实体中最多可以有多少行?数据库中可以驻留多少数据?iOS的核心数据限制

一般来说,如果某些文档可以描述Core Data(适用于iOS)内部存在的所有类型的限制?

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

那么当我们谈论iOS环境时,sqlite的limitations以外的核心数据会有什么限制吗?

回答

21

对核心数据本身没有任何逻辑限制,除了那些由情境内存,磁盘空间等强加的限制。但是,如果您使用SQLite存储,您将获得default limitations of SQLite itself.如果您正在为iOS编写代码, 。

真的,您使用Core Data遇到的唯一实际限制来自于由reading in large blobs(例如,试图在SQLite商店中存储图像或音频。这可以通过将blob存储在外部文件中来避免。

另外,我会提醒你我可以通过你说的这个问题的方式来说明,你在考虑核心数据错误。

核心数据不是SQL的对象包装器。核心数据不是SQL。实体不是表格。对象不是行。列不是属性。核心数据是一个对象图管理系统,它可能会或可能不会持久化对象图,并且可能会或可能不会在后台使用SQL来做到这一点。试图用SQL语言来思考核心数据会导致你完全误解核心数据,并导致很多悲伤和浪费时间。

+2

+1。我不记得我在哪里阅读它,但有一个早期我学到的格言,如果我想弄清楚做什么的限制,那么我做错了。 – 2011-04-19 13:38:14

+1

@Philip Regan - 我们必须保存大量的图像,因此现在更好地检查它,而不是稍后再考虑它? – itsaboutcode 2011-04-20 04:49:23

+1

如果ypu're保存图片,最好将它们保存到文件中,并将一个URL存储到Core Data中的所述文件中。存储大量的二进制数据最好在其他地方完成。 – paulbailey 2011-04-20 07:45:55

0

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

二进制大数据对象(BLOB)

如果应用程序使用二进制大对象(BLOB),如图像和声音数据,你需要照顾,以尽量减少开销。一个对象被认为是小的还是大的取决于应用程序的使用情况。一般规则是小于兆字节的对象是小型或中型,而大于兆字节的对象很大。一些开发人员已经在数据库中使用10 MB BLOB获得了良好的性能。另一方面,如果应用程序在表中有数百万行,甚至128个字节可能是一个CLOB(字符大对象),需要将其标准化为一个单独的表。

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

BLOB通常表示实体的属性 - 例如,照片可能是Employee实体的属性。对于小到中等的BLOB(和CLOB),为数据创建一个单独的实体并创建一对一的关系来代替该属性。例如,您可以使用它们之间的一对一关系创建员工和照片实体,其中从员工到照片的关系将替换员工的照片属性。这种模式最大限度地利用了对象断层的好处(参见断层和非断层)。只有在实际需要的情况下(如果关系被遍历),才能检索任何给定的照片。

但是,如果您能够将BLOBs作为资源存储在文件系统上并维护对这些资源的链接(如URL或路径),则更好。然后您可以根据需要加载BLOB。