Java 如何收缩sqlite数据库?

Java 如何收缩sqlite数据库?,java,android,sqlite,Java,Android,Sqlite,一旦将我所有的数据存储到sqlite中,它已经达到14MB。这就是为什么我担心有些人无法从连接缓慢的区域下载我的应用程序。有没有办法缩小sqlite数据库?我有过使用sqlite的经验,我导入了大约3mb的数据,之后我意识到数据存在编码问题。我删除了表,重新创建了表,并在修复了编码问题后重新导入了数据。结果:一个6mb的sqlite文件。我的解决方案是删除sqlite数据库并创建一个新数据库。(没有更多关于数据库中存储内容的详细信息,我只能提供这些内容了…您试过了吗 真空命令将重建整个数据库。应

一旦将我所有的数据存储到sqlite中,它已经达到14MB。这就是为什么我担心有些人无法从连接缓慢的区域下载我的应用程序。有没有办法缩小sqlite数据库?

我有过使用sqlite的经验,我导入了大约3mb的数据,之后我意识到数据存在编码问题。我删除了表,重新创建了表,并在修复了编码问题后重新导入了数据。结果:一个6mb的sqlite文件。我的解决方案是删除sqlite数据库并创建一个新数据库。(没有更多关于数据库中存储内容的详细信息,我只能提供这些内容了…

您试过了吗

真空命令将重建整个数据库。应用程序执行此操作的原因有几个:

  • 除非SQLite在“auto_vacuum=FULL”模式下运行,否则当从数据库文件中删除大量数据时,会留下空白或“空闲”数据库页面。这意味着数据库文件可能比严格要求的要大。运行VACUUM重建数据库可以回收此空间并减小数据库文件的大小
  • 频繁的插入、更新和删除会导致数据库文件变得支离破碎,其中单个表或索引的数据分散在数据库文件中。运行VACUUM可以确保每个表和索引在很大程度上连续存储在数据库文件中。在某些情况下,真空还可能减少数据库中部分填充的页面数,从而进一步减小数据库文件的大小
真空命令的工作原理是将数据库的内容复制到临时数据库文件中,然后用临时文件的内容覆盖原始文件。当覆盖原始数据时,回滚日志或WAL文件的使用方式与任何其他数据库事务一样。这意味着在清空数据库时,可用磁盘空间中需要的大小是原始数据库文件的两倍

一些提示:

  • SQLite有点懒于回收未使用的空间;使用命令或

  • datbase格式以空间效率换取快速访问。如果您只是转储数据内容,或者作为SQL转储,或者只是每个数据库表的一个CVS文件,那么您可能会得到更小的文件

  • 使用数据库文件或普通数据,尝试压缩它们


14mb对于Android应用程序来说仍然非常大,如果您可以安排从服务器下载并集成到应用程序中,那就更好了


您可以将应用程序与压缩的数据库文件(即.zip文件)捆绑在一起,并在第一次运行应用程序时将其解压缩(记住删除.zip文件)。最好在SD卡上完成所有这些操作。

在从资产中解压缩数据库时,尝试压缩它并使用zipinput流。无论如何,android会在你创建apk时压缩你的14mb数据库(安装时会解压缩),所以我猜你的apk大小大约在5-6mb左右。

14mb对于现在的应用来说并没有那么大。 您可以尝试的另一件事是删除不必要的表索引。有些索引可能隐藏在表中,它们可能会占用大量空间。您可能需要以不同的方式进行查询。

在答案中加入@Tono Nam。具有完整语法的示例总是非常有用的

在命令行上运行以下命令以使用
vacuum
命令:

sqlite3 /path/to/your/db/foo.db 'VACUUM;'

为什么在修复编码问题后会出现3MB到6MB的情况?删除初始3MB表后的空数据库保持在3MB,添加新数据后又增加了3个。你能给我提供(链接或编码)当应用程序第一次运行时如何压缩和解压DB文件吗?我从Android文档中学到了如何做到这一点。谷歌搜索,或者这里的搜索,会让你看到Android在创建/导出apk文件时会自动压缩?是的。我的应用程序的资产中有一个12 mb的数据库。创建apk时,apj=k文件大小仅为4mb。我想如果我在资产中使用zip文件,我甚至可以进一步减少它。正如PPShein提到的,android将压缩数据库,但您可以使用7zip。然后通过这个库解包:或者您可以在第一次应用程序启动时重建它们。运行以下命令:
sqlite3/path/to/your/db/foo.db'VACUUM;'
您可以运行
真空直接在查询窗口中