【发布时间】:2011-12-02 16:59:33
【问题描述】:
将我的所有数据存储到 sqlite 后,它已经达到 14 MB。这就是为什么我担心有些人无法从连接缓慢的区域下载我的应用程序。有什么办法可以缩小 sqlite 数据库?
【问题讨论】:
将我的所有数据存储到 sqlite 后,它已经达到 14 MB。这就是为什么我担心有些人无法从连接缓慢的区域下载我的应用程序。有什么办法可以缩小 sqlite 数据库?
【问题讨论】:
你试过VACUUM吗?
VACUUM 命令重建整个数据库。应用程序可能会这样做有几个原因:
- 除非 SQLite 在“auto_vacuum=FULL”模式下运行,否则当从数据库文件中删除大量数据时,会留下空白空间或“空闲”数据库页面。这意味着数据库文件可能比严格要求的要大。运行 VACUUM 来重建数据库会回收此空间并减小数据库文件的大小。
- 频繁的插入、更新和删除会导致数据库文件变得碎片化——单个表或索引的数据分散在数据库文件周围。运行 VACUUM 可确保每个表和索引在很大程度上连续存储在数据库文件中。在某些情况下,VACUUM 还可以减少数据库中部分填充的页面数量,从而进一步减小数据库文件的大小......
VACUUM 命令的工作原理是将数据库的内容复制到一个临时数据库文件中,然后用临时文件的内容覆盖原始文件。覆盖原始文件时,将使用回滚日志或write-ahead log WAL 文件,就像用于任何其他数据库事务一样。这意味着当对数据库进行 VACUUM 操作时,需要的可用磁盘空间是原始数据库文件大小的两倍...
【讨论】:
sqlite3 /path/to/your/db/foo.db 'VACUUM;'
VACUUM;
一些提示:
SQLite 有点懒于回收未使用的空间;使用VACUUM 命令或auto vacuum mode。
数据库格式以空间效率换取快速访问。如果您只是将数据内容转储为 SQL 转储或只是为每个数据库表提供一个 CVS 文件,您可能会得到更小的文件。
使用数据库文件或纯数据,尝试压缩它们。
【讨论】:
将@Tono Nam 的comment 放入答案中。一个完整语法的例子总是很有帮助的。
在命令行上运行以下命令以使用vacuum 命令:
sqlite3 /path/to/your/db/foo.db 'VACUUM;'
【讨论】:
尝试压缩它并在从资产中解压数据库时使用 zipinput 流。无论如何,当您创建 apk 时,android 会压缩您的 14mb 数据库(在安装过程中会解压缩),所以我猜您的 apk 大小约为 5-6mb。
【讨论】:
我有使用 sqlite 的经验,我导入了大约 3mb 的数据,之后我意识到数据存在编码问题。我删除了表格,重新制作了表格,并在修复了编码问题后重新导入了数据。结果:一个 6mb 的 sqlite 文件。我的解决方案是删除 sqlite 数据库并创建一个新数据库。 (如果没有关于您在数据库中存储的内容的更多详细信息,这就是我所能提供的......)
【讨论】:
对于 Android 应用来说,14mb 还是非常大的,如果您可以安排从服务器下载它并集成到应用中,那就更好了。
您可以将应用程序与压缩的数据库文件(即 .zip 文件)捆绑在一起,并在应用程序首次运行时解压缩(记住删除 .zip 文件)。最好在 SD 卡上完成所有这些操作。
【讨论】:
14MB 对于当今的应用程序来说并不算大。 您可以尝试的另一件事是删除不必要的表索引。某些索引可能潜伏在您的表中,它们会占用大量空间。您可能需要以不同的方式进行查询。
【讨论】: