【问题标题】:Saving png image in database through android app通过android应用程序将png图像保存在数据库中
【发布时间】:2019-04-03 19:35:47
【问题描述】:

我想使用我开发的应用程序将图像保存到移动设备中,最好的方法是什么。

我试图通过 sqlite 保存,但还有其他选择吗?

【问题讨论】:

  • 将图像保存在数据库中是不正确的。相反,您必须保存图像路径
  • 你有什么例子吗,我们需要加密图像吗?
  • 加密还是压缩? @tTechDubey
  • 当我们将图片保存到路径时,我们应该压缩图片或者我们可以不压缩保存。

标签: android sqlite imageview android-image android-database


【解决方案1】:

推荐的方法是将图像存储为不在数据库中的文件,然后存储路径或足够的路径以唯一标识数据库中的图像。

要存储图像,您必须将其存储为基于 byte[](字节数组)的 BLOB; 但是,使用 Android SDK 存在一个限制,即即使可以保存,也只能检索小于 2MB 的图像。

  • 从技术上讲,您可以将图像存储为十六进制、二进制、八进制字符串,但这会更复杂、效率更低,甚至更具限制性。。所以真的你必须将它存储为 BLOB 并不完全符合事实。

使用 SQLite 或大多数结构化数据库存储图像(或任何大文件)实际上也毫无用处,因为您对数据查询几乎无能为力。

您实际上是通过 SQL 使用类似的方式保存 BLOB:-

INSERT INTO your_table VALUES(x'00FF01EF');
  • 即00(0)是第一个字节,FF(255)是第二个,01(01)是第三个......
  • 请注意,上述内容仅适用于具有单列的表

但是,SQLiteDatabase insert 便捷方法会代表您将 byte[] 转换为正确的 SQL(十六进制字符串)。

所以你通常会使用:-

ContentValues cv = new ContentValues();
cv.put("your_column",your_image_as_a_byte_array);
your_sqlitedatabase_object.insert("your_table",null,cv);

您使用类似于

的内容从光标(查询的结果)中检索字节数组
your_retrieved_image_byte_array = your_cursor.getBlob(your_column_offset_as_an_int); //<<<<<<<<< CursorWindow full error if the row cannot fit into the CursorWindow which has 2MB limit

您可能希望查看How can I insert image in a sqlite database,因为它更详细,并且具有存储图像和路径的代码(根据图像大小存储任何一个,小于 100k,然后存储图像,否则将存储路径)并另外将图像检索到 ListView 中。此外,虽然不推荐这是一种绕过 2Mb 限制的方法How to use images in Android SQLite that are larger than the limitations of a CursorWindow?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多