sqlite中的图片很大

时间:2013-04-26 13:54:01

标签: android image sqlite

我想在blob字段中将5 Mb的图像放入sqlite数据库中。 插入后,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();
}

这是我将它们插入db:

的方式
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();
    }

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

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

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