我正在将位图存储到我的sql数据库中,将其转换为字节数组并作为BLOB存储在sql表中。然后,我从表中的字节数组中检索BLOB,然后将其转换为位图,在图像视图中显示。
为此,我首先将位图转换成字节数组,像这样。
Bitmap thumbnail = ThumbnailUtils.extractThumbnail(currentBitmap, 512, 384);
byte[] thumbBytes = getBytesFromBitmap(thumbnail, 10);
myDB.createNewDoc(tempName, currentTable, thumbBytes, dateCreated);
这是我的getBytesFromBitmap()方法。
public byte[] getBytesFromBitmap(Bitmap bitmap, int quality) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.WEBP, quality, out);
return out.toByteArray();
这里currentBitmap是我的原始位图。
这是我用来创建表的sql查询,该表将包含一个存储位图的列。
sqLiteDatabase.execSQL("CREATE TABLE IF NOT EXISTS DOCS_DATA (SNO INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT UNIQUE NOT NULL, TABLE_NAME TEXT UNIQUE NOT NULL, THUMBNAIL BLOB, CREATEDON TEXT);");
这里倒数第二列是BLOB类型的THUMBNAIL,包含转换为字节数组的位图。
为了向该表插入数据,我使用了以下查询。
public void createNewDoc(String doc_name, String table_name, byte[] thumbnail, String created_on) {
sqLiteDatabase.execSQL("INSERT INTO DOCS_DATA (NAME, TABLE_NAME, THUMBNAIL, CREATEDON) VALUES ('" + doc_name + "', '" + table_name + "', '" + thumbnail + "', '" + created_on + "');");
现在,为了从表中检索数据,我使用了以下方法。
public ArrayList<Object> getAllDocs() {
ArrayList<String> names = new ArrayList<>();
ArrayList<Integer> imagesNumber = new ArrayList<>();
ArrayList<Bitmap> thumbnails = new ArrayList<>();
ArrayList<String> createdon = new ArrayList<>();
Cursor cur = sqLiteDatabase.rawQuery("SELECT NAME, TABLE_NAME, THUMBNAIL, CREATEDON FROM DOCS_DATA ORDER BY SNO;", null);
for (int i = 0 ; i < cur.getCount() ; i++) {
cur.moveToPosition(i);
names.add(cur.getString(0));
byte[] img = cur.getBlob(2);
Log.e("BLOB ---- ", ""+img.toString());
Log.e("BLOB ---- ", ""+img.length);
Bitmap bitmap = BitmapFactory.decodeByteArray(img, 0, img.length);
Log.e("Bitmap", ""+bitmap);
thumbnails.add(bitmap);
createdon.add(cur.getString(3));
Cursor cur1 = sqLiteDatabase.rawQuery("SELECT * FROM " + cur.getString(1) + ";", null);
imagesNumber.add(cur1.getCount());
cur1.close();
cur.close();
ArrayList<Object> objects = new ArrayList<>();
objects.add(names);
objects.add(imagesNumber);
objects.add(thumbnails);
objects.add(createdon);
return objects;
你可以看到,在这最后一部分代码中,我有3个Log.e(...),这就是我通过这3个日志得到的东西。
E/BLOB ----: [B@ef5c8e2
E/BLOB ----: 29753