Android sqlite / BLOB性能问题

时间:2011-12-06 13:17:45

标签: android performance sqlite blob

自从我将数据从ArrayList移动​​到Android上的sqlite数据库以来,我的性能严重下降。没有游标可以导致这样做,所以我怀疑问题在于我存储在BLOB字段中的图像。

应用程序创建 Cards ,其中包含 cardBitmap 字段,该字段在创建时会填充位图。

任何人都可以告诉我他们的经验,哪种解决方案更具性能:

  1. cardBitmap 包含SDcard上文件的引用(路径),该文件将在创建时绘制。只有路径存储在DB中。
  2. cardBitmap 包含一个对象( BitmapFactory.decodeStream(imageStream,null,null)),其中 imageStream 被读取为来自相应数据库字段的ByteArrayInputStream
  3. 任何建议都会有所帮助。谢谢!

3 个答案:

答案 0 :(得分:10)

我还没有评论答案的声誉,所以我会将我的2句作为答案添加,请原谅我。

我正在寻找类似问题的答案,我不认为当前的答案令人满意,因为如果你问SQLite.org他们会告诉你它取决于blob大小和页面大小。

他们已经做了一个基准测试 - 不是在Android上 - 这表明在SQLite中存储blob对于小blob(高达20kB)比在单独文件上存储更快。 对于大于100kB的blob,性能下降很大,并且最好将blob存储在单独的文件中(user370605)推荐。 见http://www.sqlite.org/intern-v-extern-blob.html

我会考虑Android没有回答的问题。

答案 1 :(得分:8)

第一个解决方案更好,使用sdcard中的文件并将参考路径存储在sqlite数据库中,这样可以提高性能,同时数据库仍然保持轻量级。

答案 2 :(得分:1)

我也没有足够的声誉来发表评论。我正在添加此答案,以帮助仍在寻找建议的任何人。经过几年的硬件改进,这两种解决方案的性能差别不大。我在Nexus 6p中尝试了几次,向SQLite写一个大约2 MB的图像二进制文件,平均只花费50毫秒。即使外部存储器性能更好,但目前的性能可以达到我的预期。写入SQLite不需要WRITE_EXTERNAL_STORAGE权限,如果从其他应用程序授予权限,则可以撤消该权限。在这种情况下,SQLite可能是一个不错的选择。