gpt4 book ai didi

ios - 如何获取核心数据存储中存在的数据大小?

转载 作者:可可西里 更新时间:2023-11-01 03:10:12 26 4
gpt4 key购买 nike

如何获取核心数据存储中数据的总内存大小(以字节为单位)。以及如何获取特定数据行的内存大小。

最佳答案

在 iOS 7 及更高版本上,older answers由于 SQLite 日志文件,不再适用于 SQLite 支持的持久存储。对于每个持久存储文件,您需要获取 SQLite 文件本身的大小(例如 Foo.sqlite ) 日志文件的大小(例如 Foo.sqlite-walFoo.sqlite-shm )并添加大小得到总数。这非常重要,因为很可能大部分数据实际上都在日志文件中。您可以使用 NSFileManager获取每个文件的此信息。

如果您在模型中使用二进制属性并且您为这些属性中的任何一个启用了“允许外部存储”,它会变得更加复杂。在这种情况下,您需要找到所有外部存储文件并将它们的大小也加起来。它们的位置没有记录,但应该在 SQLite 文件所在目录的子目录中。对于名为 Foo.sqlite 的 SQLite 文件查找名为 .Foo_SUPPORT/_EXTERNAL_DATA 的目录,外部二进制文件将在那里。 由于没有记录,因此可能会在没有警告的情况下进行更改。

一个更好的方法——如果还不算太晚的话——是将持久存储放在它自己的子目录中。不要将它放在文档目录中,而是在文档中创建一个新目录并将您的 SQLite 文件放在那里。也就是说,创建一个名为 data 的目录然后放Foo.sqlite在里面。要增加大小,只需递归扫描 data 中的每个文件即可。并将尺寸相加。然后你会捕获一切,即使是日记或外部二进制文件或 future 版本的 iOS 中的任何变化。进行扫描的一个好方法是使用 NSFileManagerenumeratorAtPath:enumeratorAtURL:includingPropertiesForKeys:options:errorHandler:方法。

查找特定数据行的内存大小是一个非常不同的问题,并且没有通用的解决方案。有任何对象实例的开销,加上你的属性,再加上任何内部未记录的对象 NSManagedObject可能会创建(包括实例变量和动态分配的内存)。它甚至不是固定值,因为数据可以动态分配和释放。仅将您的属性的大小相加很容易 - 只需遍历它们并将每个属性的大小(字符串长度、数据长度等)相加即可,但这不是全貌。

关于ios - 如何获取核心数据存储中存在的数据大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24178776/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com