假设我有一个应用程序,可让您浏览在 Sqlite 数据库中找到的汽车列表。当您单击列表中的汽车时,它将打开一个包含汽车描述和汽车照片的视图。
我的问题是:我应该将照片作为特定汽车的行中的二进制数据列保存在数据库中,还是应该将照片放在资源目录中的某个位置?哪个更好?就二进制数据列的大小而言,Sqlite 是否有任何限制?
该数据库几乎是只读的并与应用程序捆绑在一起(因此用户不会插入任何汽车及其照片)。
假设我有一个应用程序,可让您浏览在 Sqlite 数据库中找到的汽车列表。当您单击列表中的汽车时,它将打开一个包含汽车描述和汽车照片的视图。
我的问题是:我应该将照片作为特定汽车的行中的二进制数据列保存在数据库中,还是应该将照片放在资源目录中的某个位置?哪个更好?就二进制数据列的大小而言,Sqlite 是否有任何限制?
该数据库几乎是只读的并与应用程序捆绑在一起(因此用户不会插入任何汽车及其照片)。
这是一个讨论了很多的决定。在我看来,这是个人品味的问题。很像 vim/emacs,windows/linux 之类的辩论。不过没那么热。
双方各有优缺点。当您将它们存储在数据库中时,您不必担心文件名和位置。管理也更容易(删除包含 BLOB 的行,仅此而已)。但是这些文件也更难访问,您可能需要以一种或另一种方式编写包装器代码(例如,其中一些“download.php”链接)。
另一方面,如果将二进制数据存储为单独的文件,则管理更加复杂(您需要先构造文件名,从磁盘中打开正确的文件)。在大型数据集上,当一个目录中的文件数量变得非常大时,您可能会遇到文件系统瓶颈(但这可以通过轻松创建子目录来防止)。但是,如果将数据存储为文件,替换它们就会变得容易得多。其他人也可以访问它而无需了解内部情况(例如,一个喜欢定制他/她的 UI 的用户)。
肯定还有其他的点要提,不过现在不想写太多了……
我想说:考虑一下您想对照片进行哪些操作(以及两种存储方法的局限性),然后做出明智的决定。没有什么可以出错的。
在进一步调查中,我发现了更多信息:
我不知道 SQLite 的 TX-Log 的确切实现,但是可以预料每个INSERT
/UPDATE
操作都会在磁盘上执行两次写入。我可能弄错了(这在很大程度上取决于事务的实现),但坦率地说,我懒得浏览 SQLite 源代码。对我来说,感觉就像我们在这里开始分裂头发(过早的优化任何人?)......
由于两个文件系统(YAFFS 和 VFAT)都没有日志记录,因此您没有额外的“隐藏”写入操作。
这两点支持文件系统。
请注意,此信息需要谨慎对待。我只浏览了 和 的 GoogleYAFFS journaling
结果sqlite transaction log
。我可能错过了一些细节。
BLOB 或 String的默认 MAX SQLite 大小为 2 31 -1 字节。该值也适用于要存储在 ROW 中的最大字节数。
至于哪种方法更好,我不知道。在您的情况下,我会做的是测试这两种方法并监控内存使用情况及其对电池寿命的影响。也许您会发现文件系统方法在该领域比其他方法具有明显的优势,并且将其存储在 SQLite 中的便利性对于您的用例来说并不值得,或者您可能会发现相反的情况。