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