【问题标题】:Images in sqlite hugesqlite中的图像巨大
【发布时间】:2013-04-20 17:37:12
【问题描述】:

我有 5 Mb 的图像,我想在 blob 字段中放入 sqlite db。 插入后,db大约为50Mb。

这就是我获得byte[]的方式:

private static byte[] getByteArrayFromFileName(String filename) {
    int id = context.getResources().getIdentifier(filename, "raw", context.getPackageName());
    ByteArrayOutputStream blob = new ByteArrayOutputStream();
    BitmapFactory.decodeResource(context.getResources(), id).compress(CompressFormat.PNG, 0, blob);
    return blob.toByteArray();
}

这就是我将它们插入数据库的方式:

public void createImage(SQLiteDatabase database, Image image) throws DbException {
    ContentValues values = new ContentValues();
    values.put(ImageTable.DATA, image.data);
    values.put(ImageTable.TYPE_ID, image.type.getValue());
    values.put(ImageTable.LEVELID, image.levelId);
    values.put(ImageTable.ID, image.id);

    if (database.replace(ImageTable.TABLE_NAME, null, values) == -1) {
        throw new DbException("createImage insertion error");
    }
}

我在搞砸什么? :)

编辑:问题是,我不应该将位图放入数据库,而应该只是原始(以 jpeg 格式压缩)文件。所以作为参考,这是从位图文件中获取 byte[] 的正确方法,因此它的大小仍然很小:

private static byte[] getByteArrayFromRawByFileName(Context context, String filename) throws IOException {
        int id = context.getResources().getIdentifier(filename, "raw", context.getPackageName());
        InputStream is = context.getResources().openRawResource(id);
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        int bytesRead;
        byte[] b = new byte[1024];
        while ((bytesRead = is.read(b)) != -1) {
            bos.write(b, 0, bytesRead);
        }
        return bos.toByteArray();
    }

【问题讨论】:

  • 您不应将图像作为 blob 存储在数据库中。事实。
  • 无论如何,到底有什么问题?大小增加了 10 倍?

标签: android image sqlite


【解决方案1】:

问题可能是您使用JPEG 图像作为源,但在插入之前您将它们编码为PNG,这就是我相信10 倍增长的原因。您的 getByteArrayFromFileName() 也是一个失败的原因,因为您有一个文件,您可以将其读取为 byteArray 而不涉及 BitmapFactory

【讨论】:

  • 这几乎是答案......我将它们作为位图读取,而不仅仅是作为文件,这就是大小增加的原因:)
【解决方案2】:

将图像作为 blob 存储在数据库中可能不是一个好主意。有几个原因...

  • 在 Android 上,您的数据库文件存储在手机的内部存储器中,而不是 SD 卡中。由于手机的内部存储空间可能非常有限,因此在 SD 卡上存储大量内容始终是一个好主意。不过,此参数在不允许扩展存储的较新设备上可能无效。
  • 如果用户决定卸载您的应用,图片也会随之而来。

我建议将图像保存到 SD 卡,并将文件路径存储在数据库中。

【讨论】:

  • 重点是防止用户轻易访问图像。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多