Database 用app:files或sqlite数据库捆绑照片的最佳方法?

Database 用app:files或sqlite数据库捆绑照片的最佳方法?,database,android,sqlite,image,binary-data,Database,Android,Sqlite,Image,Binary Data,假设我有一个应用程序,可以让你浏览Sqlite数据库中的汽车列表。当你点击列表中的一辆汽车时,它会打开一个包含汽车描述和汽车照片的视图 我的问题是:我应该将照片作为二进制数据列保存在数据库中的某一行中,以用于此特定汽车,还是应该将照片保存在参考资料目录中的某个位置?哪一个更好?Sqlite在二进制数据列的大小方面是否有任何限制 数据库基本上是只读的,并与应用程序捆绑在一起(这样用户就不会插入任何汽车和他们的照片)。一个BLOB或字符串的大小为231-1字节。该值也适用于一行中要存储的最大字节数

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

我的问题是:我应该将照片作为二进制数据列保存在数据库中的某一行中,以用于此特定汽车,还是应该将照片保存在参考资料目录中的某个位置?哪一个更好?Sqlite在二进制数据列的大小方面是否有任何限制

数据库基本上是只读的,并与应用程序捆绑在一起(这样用户就不会插入任何汽车和他们的照片)。

一个BLOB或字符串的大小为231-1字节。该值也适用于一行中要存储的最大字节数


至于哪种方法更好,我不知道。在您的情况下,我要做的是测试这两种方法,并监控内存使用情况及其对电池寿命的影响。也许您会发现文件系统方法在这方面比其他方法有明显的优势,并且在SQLite中存储它的方便性对于您的用例来说是不值得的,或者您会发现相反的情况。

这是一个被大量讨论的决定。在我看来,这是个人品味的问题。很像vim/emacs、windows/linux之类的争论。不过没那么热

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

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

我肯定还有其他的观点需要提出,但我现在不想写太多

我想说:想想你想对照片做什么操作(以及两种存储方法的局限性),然后从中做出明智的决定。没有什么会出错的

TX日志和FS日志 在进一步调查中,我发现了更多信息:

  • SQLite使用事务日志
  • Android在系统挂载点上使用YAFFS,在SD卡上使用VFAT。(据我所知)两人都未被起诉
我不知道SQLite的TX日志的具体实现,但可以预期,每个
插入
/
更新操作将在磁盘上执行两次写入操作。我可能弄错了(这在很大程度上取决于事务的实现),但坦率地说,我懒得浏览SQLite源代码。在我看来,我们开始在这里挑拨离间了(有人吗?)

由于两个文件系统(YAFFS和VFAT)都没有日志记录,因此您没有额外的“隐藏”写入操作

这两点有利于文件系统


请注意,这一信息是有保留的。我只浏览了
YAFFS日志记录
sqlite事务日志
的谷歌结果。我可能遗漏了一些细节。

请注意,sqlite数据库存储为单个文件;您可能会遇到文件系统限制(例如FAT32上臭名昭著的4GB文件大小限制)。如果您计划在ThumbDrive或类似的设备上发布应用程序,请记住一点。如果数据是静态的,并且只能检索,那么就性能而言,您有什么建议?@CptCecil:我的直觉告诉我:文件系统。但这也要视情况而定。很多小文件,一些大文件?底层FS在做什么?有日志记录吗?对于数据库:在合并数据之前,它是否会写入事务日志?。。。等等你看,没有所有的信息,很难说。。。