2011-10-07 93 views
12

完成将所有数据存储到sqlite后,它已达到14 MB。这就是为什么我担心有些人无法从连接缓慢区域下载我的应用程序。有什么办法可以压缩sqlite数据库吗?如何缩小sqlite数据库?

回答

19

你试过VACUUM

VACUUM命令重建整个数据库。有几个原因应用程序可能做到这一点:

  • 除非SQLite是在“auto_vacuum = FULL”模式下运行,当大量的数据从数据库中删除的文件会留下空白空间,或“免费”数据库页面。这意味着数据库文件可能比绝对必要的文件大。运行VACUUM重建数据库将回收此空间并减小数据库文件的大小。
  • 频繁插入,更新和删除可能导致数据库文件变为碎片 - 单个表或索引的数据分散在数据库文件周围。运行VACUUM可确保每个表和索引大部分连续存储在数据库文件中。在某些情况下,真空也可以通过数据库的内容复制到一个临时数据库降低数据库中的部分填充的页面的数量,减少了数据库文件进一步的大小...

真空命令作品文件,然后用临时文件的内容覆盖原文件。覆盖原始文件时,将使用回滚日志或write-ahead log WAL文件,就像使用其他数据库事务一样。这意味着,清理一个数据库时,在可用磁盘空间是必需的原始数据库文件的多达两倍的大小...

+0

如何运行此命令? –

+1

@ElgsQianChen - 我建议把它作为一个SQL语句。 –

+0

谢谢,它的工作原理。当我问这个问题时,我错过了分号分号。 –

1

我有一个sqlite的经验,我导入了大约3mb的数据,之后我意识到数据有编码问题。我放弃了表格,重新制作了表格,并在解决了编码问题后重新导入了数据。结果:一个6mb的sqlite文件。我的解决方案是删除sqlite数据库,只是做一个新的。 (没有更多的细节,你在你的分贝存储,这是我可以提供...)

+0

固定编码问题后3MB到6MB怎么样? – ppshein

+0

删除最初的3mb表之后的空数据库停留在3mb,并且添加新数据添加了另一个3. – bdares

8

一些提示:

  • SQLite是有点懒回收未使用的空间;使用VACUUM命令或auto vacuum mode

  • 数据库格式为快速访问交易空间效率。如果只是转储数据内容,无论是作为SQL转储还是简单地将每个数据库表的CVS文件转储,您可能会得到较小的文件。

  • 要么使用数据库文件或明文数据,尝试压缩它们。

1

14MB是一个Android应用程序还是非常大的,这是如果你可以安排它被从服务器下载并集成到应用程序更好。

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

+0

您可以提供给我(链接或编码)如何在应用程序第一次运行时压缩和解压缩DB文件? – ppshein

+1

我学会了如何从Android文档中做到这一点。谷歌搜索,或在这里搜索,给你http://stackoverflow.com/questions/3382996/how-to-unzip-files-programmatically-in-android – SK9

2

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

+1

Android会创建/导出apk文件时自动压缩? – ppshein

+0

你好。我的应用程序有一个12 MB的资产数据库。在创建apk时,apj = k文件大小仅为4mb。如果我在资产内使用zip文件,我想我甚至可以进一步降低它。 – rDroid

0

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

+1

或者您可以在第一次应用程序启动时重新构建它们。 – xryl669