Android中预先填充的数据库:尝试将各个部分组合在一起

时间:2012-01-18 01:36:12

标签: android

我一直在本网站和其他人那里收集有关在Android中包含预先填充的sqlite数据库的最佳方式的信息。我只是想确认我理解为什么某些事情应该是微不足道的原因......事实并非如此。

如果我的以下结论是正确或错误的话,有人可以告诉我吗?:

  • 许多人建议将预先填充的数据库文件从assets文件夹复制到“/ data / data / YOUR_PACKAGE / databases /”的主要原因是因为无法访问数据库文件在资产文件夹中或这样做会过于复杂(?)。 (有人可以澄清这两个答案中哪一个是正确答案?)
  • 另一个重要原因必须将assets文件夹中的数据库文件复制到其他位置,因为该位置中的文件无法更新。然后,即使资源文件夹中的数据库可以打开,只有在不必修改此类数据库时,这才有用。 更新: 我发布了一个仅关注此问题的新主题: Opening a read only database directly in the assets folder
  • 资产文件夹中的
  • 文件大小只能为1 Mb(除非它们具有某些文件扩展名,例如mp3)。请注意,如果出现以下情况,则此限制无关:您的数据库小于1 Mb,或者您不介意将数据库分成1 Mb块并在运行时将它们放在一起,或者您不介意分发带有mp3扩展名的数据库文件。
  • 如果将数据库文件从assets文件夹复制到“/ data / data / YOUR_PACKAGE / databases /”,则无法删除assets文件夹中的原始数据库文件以避免出现重复文件。这也是因为无法修改assets文件夹中的文件。

让拼图变得更复杂:我在评论中找到了这个问题的接受答案:Ship an application with a database 将数据库从assets文件夹复制到另一个位置实际上对某些运行2.3+的设备不起作用。那是准确的吗?如果这是真的,那么最好的选择是在第一次运行时从网上下载数据库文件吗?

感谢您的任何澄清。

1 个答案:

答案 0 :(得分:1)

您实际上会将apk与设备上的实际文件夹混淆。

将apk视为安装包 - 与Windows世界的msi不同。此安装包的整个目标是安全地验证并向您的设备提供代码和资源。在一个简单的实现中,您可以将所述代码解压缩到一个只读位置,这些资源可以读写,并且可以随心所欲。

为了节省空间,Android更加智能 - 代码和资源永远不会离开已签名的存档,所以你总是知道它是你放入的并且你不会通过存储来浪费空间代码两次。在类加载器中有一些真正的魔力,它还允许它在运行时解压缩类,但除此之外。

因此,基本上,此压缩安装包中的所有内容都是只读的(由于也是签名)。成为“安装程序”并将您需要的任何资源移动到可读写位置是您的工作。当然,你不能触摸apk一旦它到位,因为那会导致恶意软件并且无法完成签名的全部目的。

希望这可以解决这个困惑。