我在iOS 7中编码,我的应用程序使用Core Data。核心数据对我来说效果很好。
我编写了一个例程,它将显示我的核心数据的大小和剩余的可用空间量,我对我所看到的内容感到有点困惑。
我的核心数据包含三个文件Next_ID.sqlite,PhotoSm.sqlite和PhotoLg.sqlite。
当我刚刚创建新数据库时,我的结果看起来像这样:
Next_ID = 36,864 bytes
PhotoSm = 36,864 bytes
PhotoLg = 36,864 bytes
Free = 1,507,385,344 bytes
在我将10或15个项目添加到数据库后,数字看起来像这样:
Next_ID = 14,888,960 bytes
PhotoSm = 36,864 bytes
PhotoLg = 36,864 bytes
Free = 1,488,846,848 bytes
首先,我很惊讶Next_ID发生了很大的变化,因为它实际上仅用于保留每次向数据库添加新数据时都会遇到的唯一整数。
接下来,我很惊讶PhotoSm和PhotoLg都没有改变。
最后,费用空间的变化表明已消耗了18,538,496字节。但是Next_ID的变化表明它只使用了14,852,096个字节。所以,我似乎缺少3,686,400字节。
这是我的问题:
Q1:Next_ID.sqlite,PhotoSm.sqlite和PhotoLg.sqlite是SQLite数据库中的表,所以也许没有理由询问各个表有多大?
Q2:我对Next_ID.sqlite表的大小进行了更改这一事实表明,当我调整大小时,我可能会对整个数据库进行测量吗?这是因为它是数据库中的第一个表吗?
当我创建数据库为空时,所有三个表仍然显示36,864字节的大小,因此似乎存在一个初始结构,可能包含空格。
问题3:因此,担心丢失的3,686,400字节可能是一个愚蠢的错误,因为数据库的大小与放入数据的大小之间没有1:1的关系?
如果这些想法是正确的,那么:
第四季:我想知道是否有办法查询整个数据库的大小,而不会陷入在表级查询的混乱?至于我用来运行我的查询的代码,我已经仔细检查了它,它没有丢失任何错误,作为测试,我已经用stackoverflow上的工作示例替换了它,我总是得到相同的结果。
答案 0 :(得分:2)
@bneely是对的--CoreData不仅仅是一个数据库前端。我很确定你的工作有误 - 它会给你带来兆字节的损失以及nextId表的巨大增长。首先考虑阅读CoreData programming guide,至少是技术概述
至于你的问题:
A1:是的,如果您使用CoreData,则询问单个表的大小是没有意义的。 CoreData是一个对象图,它的内部存储实现(表,关系等)是隐藏的
A2:我几乎可以肯定,你是用Next_ID.sqlite初始化持久性存储协调器,所以它不是一个表 - 它的数据库。并且它的大小增长(可能)因为你在CoreData中存储图像(这绝对是错误的模式)
A3:什么是免费尺寸?免费尺寸是什么?设备的闪存?它可以因为另一个应用程序的活动而改变。获得免费大小似乎是无稽之谈
A4:Finding file's size
附:再次,学习如何使用您使用的技术。您的问题显示了对CoreData主要想法的误解 - Apple已经撰写了大量有关CoreData的文档。必须阅读,否则你每天都会对CoreData感到头疼。