使用app:文件或sqlite数据库捆绑照片的最佳方法?

时间:2010-06-07 14:48:46

标签: database android sqlite image binary-data

假设我有一个应用程序,可以让您浏览在Sqlite数据库中找到的汽车列表。当您点击列表中的汽车时,它会打开一个包含汽车描述和汽车照片的视图。

我的问题是:我应该将照片作为特定汽车行中的二进制数据列保存在数据库中,还是应该将照片放在资源目录中的某个位置?哪个更好?就二进制数据列的大小而言,Sqlite是否有任何限制?

数据库几乎只能读取并与应用程序捆绑在一起(因此用户不会插入任何汽车及其照片)。

2 个答案:

答案 0 :(得分:4)

这是一个经过深思熟虑的决定。在我看来,这是个人品味的问题。非常像vim / emacs,windows / linux类的辩论。虽然没那么激烈。

双方各有利弊。将它们存储在数据库中时,您无需担心文件名和位置。管理也更容易(你删除包含BLOB的行,就是这样)。但是文件也很难访问,你可能需要以某种方式编写包装代码(例如,某些“download.php”链接)。

另一方面,如果二进制数据存储为单独的文件,则管理更复杂(您需要先通过构造文件名从磁盘打开正确的文件)。在大型数据集上,当一个目录中的文件数量变得非常大时,您可能会遇到文件系统瓶颈(但这可以通过轻松创建子目录来防止)。但是,如果数据存储为文件,则替换它们会变得非常容易。其他人也可以在不需要了解内部的情况下访问它(例如,想象一下定制他/她的用户界面的用户)。

我确信还有其他要点,但我现在不想写太多......

我想说:想想你想对照片做什么操作(以及两种存储方法的局限性),并从那里做出明智的决定。可能出现的问题并不多。

TX-Log和FS-Journal

在进一步调查中,我发现了更多信息:

  • SQLite使用事务日志
  • Android在系统挂载点上使用YAFFS,在SD卡上使用VFAT。两者都是(尽我所知)没有经历过。

我不知道SQLite的TX-Log的确切实现,但是可以预期每个INSERT / UPDATE操作将在磁盘上执行两次写操作。我可能弄错了(这在很大程度上取决于事务的实现),但坦率地说,我不能轻易浏览SQLite源代码。我觉得我们在这里开始分裂头发(过早优化任何人?)......

由于两个文件系统(YAFFS和VFAT)都没有记录,因此您没有其他“隐藏”写入操作。

这两点支持文件系统。

请注意,此信息应与一粒盐一起使用。我只浏览了YAFFS journalingsqlite transaction log的Google搜索结果。我可能错过了一些细节。

答案 1 :(得分:0)

BLOB或String的default MAX SQLite size是2 31 -1个字节。该值也适用于要存储在ROW中的最大字节数。

至于哪种方法更好,我不知道。在您的情况下我会做的是测试两种方法并监控内存使用情况及其对电池寿命的影响。也许你会发现文件系统方法在该领域中具有明显的优势,并且在SQLite中存储它的难易程度对于你的用例来说是不值得的,或者你可能会发现相反的情况。