【问题标题】:How to understand what I see when I size my Core Data?如何理解我在调整核心数据大小时看到的内容?
【发布时间】:2013-10-05 05:19:56
【问题描述】:

我在 iOS 7 中编码,我的应用使用 Core Data。 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 上的工作示例中的代码替换了它,我总是得到相同的结果。

【问题讨论】:

  • 您是如何获得这些数字的?为什么它对你很重要? Core Data 不仅仅是一个数据库前端,实际的数据库内容和大小是一个与您无关的实现细节。

标签: core-data ios7


【解决方案1】:

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

附言再次,学习如何使用您使用的技术。您的问题表明对 CoreData 主要思想的误解 - Apple 已经编写了关于 CoreData 的大量文档。一定要读一读,否则你每天都会为CoreData头疼。

【讨论】:

  • @bneely 和 Petro,你们俩都表示我对 Core Data 有一些深刻的误解。因此,我将听取您的建议,或者重新阅读您引用的所有材料并进行全面审查。感谢您的想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-28
  • 2015-06-26
  • 2016-08-04
  • 2010-09-08
  • 1970-01-01
相关资源
最近更新 更多