具有庞大数据库的android应用程序

具有庞大数据库的android应用程序,android,sqlite,Android,Sqlite,让我解释一下我的应用程序应该如何工作: 应用程序将在其资产文件夹中附带一个sqlite数据库,该数据库稍后将复制到数据库文件夹中,其中包含一些内容(类别、子类别、产品和新闻),它们都有图像。下载后,用户可以通过internet更新内容,应用程序将新内容存储在数据库中,以便应用程序可以脱机执行 所以我的问题是,过一段时间,这个内容的大小会增加,它会导致我的应用程序崩溃吗?假设我使用1MB数据库发布应用程序,经过2年的工作,数据库大小增加到120MB左右。它会使申请崩溃吗 另一个问题是,目前我正在将

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

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

所以我的问题是,过一段时间,这个内容的大小会增加,它会导致我的应用程序崩溃吗?假设我使用1MB数据库发布应用程序,经过2年的工作,数据库大小增加到120MB左右。它会使申请崩溃吗

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


请记住,应用程序应该能够脱机加载内容

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

不,应用程序不会因为数据库太大而崩溃

光标的一部分意义在于,它为您提供了一个大数据集的视图,而无需同时将所有数据加载到内存中

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

另外,不管数据库是否很大,都不要在主线程上对它进行任何查询。如果需要在UI中显示查询结果,请使用
加载程序
API

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


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

该线程可能会回答您关于数据库大小的问题:不要将图像保存到数据库谢谢Sam的见解,是的,他们希望用户能够离线访问所有更新的内容,我试图解释你刚才提到的访问上周或上月数据的内容,但这正是他们想要的。关于你的第二个答案,所以基本上没有必要将其存储在我的数据库中,我应该按照你说的做。每次他们尝试更新时,我必须检查文件夹中是否有新闻图片,如果没有,再下载删除的图片?是的。也就是说,我不会尝试自己实现这一点。有几个很棒的库可以管理内存缓存、磁盘缓存,然后是网络回退选项。自己构建可能会很复杂-请检查,或者为什么,如果它不能(比如)添加记录,并且您不处理由此引发的SQLiteException,它将崩溃。什么?这和我的答案有什么关系?他们有点担心,但这不是我的决定,我更愿意转向在线方法,但他们希望它是离线的。当然,当一个设备只有4GB甚至更少的空间时,这就太多了。好吧,无论如何,你必须捕捉到可能的SQLiteException。这是一个未经检查的例外,所以更难。您还可以设置全局异常处理程序,以便在应用程序崩溃时执行smth。如果数据库很大,当没有更多空间时,可能会抛出SQLIteException等。此答案含糊不清且不正确,请详细说明。说“只捕获例外”不是答案。另外,
SQLiteException
并不是与数据库交互时可以引发的唯一异常。如果我不清楚,很抱歉。我想说的是:在任何数据库问题的情况下(您很可能会遇到数据库非常大的问题),操作系统将抛出一个未经检查的异常。我希望您知道什么是未经检查的异常,以及为什么它们更难处理。如果db不是很大,每个人都会忽略它们,但当db很大时,它们很可能发生。