Android數據庫中存取圖片通常使用兩種方式,一種是保存圖片所在路徑,二是將圖片以二進制的形式存儲(sqlite3支持BLOB數據類型)。對於兩種方法的使用,好像第二種方法不如第一種方法更受程序員歡迎,他們認為,在很多數據庫語言里,處理大字段都是不容易的,像圖片這樣的文件放在數據庫里會有問題:對數據庫的讀寫速度永遠趕不上文件系統的處理速度,使數據庫變得巨大;但也有很多人認為像圖片這樣的數據存放在數據庫中也有好處:易於備份,且備份速度絕對比備份文件快,比較容易數據遷移等等。其實這兩種方法都有優缺點,具體使用哪種方法要視情況而定。個人傾向於使用數據庫存取圖片,因為個人認為存到數據庫里的數據不會因外部數據的變化而丟失改變,比如你拍照獲得一張圖片,如果是將路徑存到數據庫,當這張照片被刪除之后,下次讀取數據庫就得不到想要的結果了。接下來詳細介紹數據庫存取圖片的方法:
1.從資源中獲取Bitmap對象
1 Resources res = getResources(); 2 Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.icon);
2.把圖片轉換成字節
1 public byte[] img(int id) 2 { 3 ByteArrayOutputStream baos = new ByteArrayOutputStream(); 4 Bitmap bitmap = ((BitmapDrawable) getResources().getDrawable(id)).getBitmap(); 5 bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); 6 return baos.toByteArray(); 7 }
3.在數據庫中插入圖片
//在數據庫創建時,圖片字段的數據類型存儲為 BLOB數據庫插入操作 public void onCreate(SQLiteDatabase db) { String sql = "create table " + TB_NAME + " ( " + ID + " integer primary key , " + IMAGE + " BLOB ) "; db.execSQL(sql); } //將圖片一字節形式存儲數據庫讀取操作 public long insert(byte[] img) { SQLiteDatabase db = getWritableDatabase(); ContentValues cv = new ContentValues(); cv.put(IMAGE, img); long result = db.insert(TB_NAME, null, cv); return result; }
4.獲取存入數據庫的圖片(Bitmap)
public Bitmap getBmp(int position) { SQLiteDatabase db = getReadableDatabase(); Cursor cursor = select(TB_NAME); cursor.moveToPosition(position); byte[] in = cursor.getBlob(cursor.getColumnIndex(IMAGE)); Bitmap bmpout = BitmapFactory.decodeByteArray(in, 0, in.length); return bmpout; }
//imgView.setImageBitmap(bm);
5.轉換獲取的圖片(Bitmap)為Drawable
1 public Drawable chage_to_drawable(Bitmap bp) 2 { 3 //因為BtimapDrawable是Drawable的子類,最終直接使用bd對象即可。 4 Bitmap bm=bp; 5 BitmapDrawable bd= new BitmapDrawable(getResource(), bm); 6 return bd; 7 }