我想在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();
}
答案 0 :(得分:3)
问题可能是您使用JPEG
图片作为来源,但在插入之前您将它们编码为PNG
,这就是我相信10倍增长的原因。您的getByteArrayFromFileName
()也是一个失败的cuz,因为您有一个文件,您可以将其视为byteArray
而不涉及BitmapFactory
答案 1 :(得分:0)
将图像作为blob存储在数据库中可能不是一个好主意。有两个原因......
我建议将图像保存到SD卡,并将文件路径存储在数据库中。