-2

我在 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 字节的大小,因此似乎存在一个初始结构并且可能包含空白空间。

Q3:那么,担心丢失 3,686,400 字节可能是徒劳的,因为 DB 的大小与放入其中的数据大小不是 1:1 的关系吗?

如果这些想法是正确的,那么:

Q4:我想知道是否有一种方法可以查询整个数据库的大小,而不会陷入表级别查询的混乱?

至于我用来运行查询的代码,我已经仔细研究过了,它没有抛出任何错误,作为测试,我已经用 stackoverflow 上工作示例中的代码替换了它,我总是得到相同的结果结果。

4

1 回答 1

2

@bneely 是对的——CoreData 不仅仅是一个数据库前端。我很确定你做错了 - 这会给你带来兆字节的损失和 nextId 表的巨大增长。考虑首先阅读CoreData 编程指南,至少是技术概述。
至于您的问题:
A1:是的,如果您使用 CoreData,询问单个表的大小是没有意义的。CoreData 是一个对象图,它的内部存储实现(表、关系等)是隐藏的。
A2:我几乎可以肯定,您正在使用 Next_ID.sqlite 初始化持久存储协调器,所以它不是表 - 它是数据库。它的大小(可能)会增长,因为您将图像存储在 CoreData 中(这绝对是错误的模式)。
A3: 什么是免费尺寸?什么免费尺寸?设备的闪光灯?它可能会因为另一个应用程序的活动而改变。获得免费大小似乎是无稽之谈。
A4:查找文件的大小

PS 再次,学习如何使用您使用的技术。您的问题显示了对 CoreData 主要思想的误解——Apple 编写了关于 CoreData 的大量文档。一定要读一读,否则你每天都会对 CoreData 感到头疼。

于 2013-09-30T18:51:15.390 回答