【问题标题】:android application with huge database具有庞大数据库的android应用程序
【发布时间】:2015-01-30 18:53:56
【问题描述】:

让我解释一下我的应用程序应该如何工作:

应用程序将在其资产文件夹中附带一个 sqlite 数据库,稍后将复制到数据库文件夹中,其中包含一些内容(类别、子类别、产品和新闻),它们都有图像。然后下载后用户可以通过互联网更新内容,应用程序将新内容存储在数据库中,以便应用程序可以离线执行。

所以我的问题是,一段时间后这些内容会增加大小,它会导致我的应用程序崩溃吗?假设我发布了具有 1 MB 数据库的应用程序,经过 2 年的工作,数据库大小增加了大约 120 MB。会不会让应用崩溃?

另外一个问题是,目前我将图像存储在数据库中,然后从那里加载它们。这是一个好方法吗?因为我不希望用户能够清除缓存或删除图像,因为稍后更新内容时它必须再次下载那些已删除的图像,并且会消耗流量。

请记住,应用程序应该能够离线加载内容

【问题讨论】:

标签: android sqlite


【解决方案1】:

不,应用程序崩溃不仅仅是因为它们的数据库很大。

Cursor 的部分意义在于它可以让您查看大量数据,而无需同时将所有数据加载到内存中。

如果您遵循最佳实践,我认为没有问题 - 您正在使用数据库。暂时忘记它是在 Android 上的——你应该尽你所能优化你的表结构、索引等。

此外,无论是否大型数据库,都不要在主线程上对其进行任何查询。如果您需要在 UI 中显示查询结果,请使用 Loader API。

最后,可能是最重要的一点,重新思考为什么需要这么大的数据库。用户离线时需要访问所有数据真的很常见吗?或者只存储上周或上月等的数据并告诉他们他们需要在线才能访问旧数据可能更有意义。

关于您的第二个问题 - 请在将来将其分开为一个单独的问题。但是,不,在 sqlite 数据库中存储二进制 blob(在这种情况下为图像)并不是一个好方法。此外,如果他们清除应用程序上的数据,一切都会消失,因此使用数据库来避免这种情况没有任何好处。我建议将图像存储在设备外部存储中以您的应用命名的文件夹中,可能会将图像 URI/名称存储在数据库中。

【讨论】:

  • 感谢 Sam 的洞察力,是的,他们希望用户能够离线访问所有更新的内容,我尝试解释您刚才提到的有关访问上周或上月数据的内容,但这就是他们的方式想要。
  • 关于你的第二个答案,所以基本上没有必要将它存储在我的数据库中,我应该按照你说的去做。并且每次他们尝试更新时,我都必须检查例如新闻文件夹中是否有其图像,如果没有,则再次下载那些已删除的图像?
  • 是的。也就是说,我不会尝试自己实施。有几个很棒的库可以管理内存缓存、磁盘缓存和网络回退选项。构建自己可能很复杂 - 查看 square.github.io/picassogithub.com/nostra13/Android-Universal-Image-Loader
  • 为什么,如果它不能,比如说,添加一条记录并且你不处理因此抛出的 SQLiteException,它会崩溃。
  • 什么?这和我的回答有什么关系?
【解决方案2】:

数据库的任何问题都会导致SQLiteException,您可以在应用程序中处理该问题,以防止异常终止。 话虽如此,120 MB 的数据库似乎太多了,您确定您的用户会想要所有这些吗?

【讨论】:

  • 他们有点担心,但这不是我的决定,我宁愿转向在线方法,但他们希望它离线。当然,当设备只有 4 GB 甚至更小的空间时,这已经太多了。
  • 好吧,无论如何,你必须捕获可能的 SQLiteExceptions。这是一个未经检查的异常,所以更难。您还可以设置一个全局异常处理程序以在您的应用程序崩溃时执行某些操作。如果数据库很大,当没有更多空间等时可能会抛出 SQLIteException。
  • 这个答案含糊不清,不正确,请扩展。说“只捕获异常”不是答案。此外,SQLiteException 不是唯一可能从与数据库的交互中引发的异常。
  • 对不起,如果我不清楚。我想说的是:如果出现任何数据库问题(并且您的数据库可能非常大),操作系统将抛出 UNCHECKED 异常。我希望你知道什么是未经检查的异常以及为什么它们更难处理。如果 db 不大,每个人都会忽略它们,但是当 db 很大时,它们很可能会发生。
猜你喜欢
  • 2012-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-08
  • 2012-05-01
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多