如何将图片存入数据库中,并从数据库中取出图片

原文链接:
有时候我们想把图片存入到数据库中,尽管这不是一种明智的选择,但有时候还是不得以会用到,下面说说将图片转换成byte[]数组存入到数据库中去,并从数据库中取出来转换成图像显示出来。  首先,我们要把图片存入到数据库中,首先要创建一个数据库, 如下所示:


  1. package com.android.test;

  2. import java.io.ByteArrayOutputStream;

  3. import android.content.ContentResolver;
  4. import android.content.ContentValues;
  5. import android.content.Context;
  6. import android.database.sqlite.SQLiteDatabase;
  7. import android.database.sqlite.SQLiteOpenHelper;
  8. import android.graphics.Bitmap;
  9. import android.graphics.Bitmap.CompressFormat;
  10. import android.graphics.drawable.BitmapDrawable;
  11. import android.graphics.drawable.Drawable;
  12. import android.provider.BaseColumns;

  13. public class PictureDatabase extends SQLiteOpenHelper {
  14.      
  15.      //数据库的字段
  16.      public static class PictureColumns implements BaseColumns {
  17.          public static final String PICTURE = "picture";
  18.      }
  19.      
  20.      private Context mContext;
  21.      
  22.      //数据库名
  23.      private static final String DATABASE_NAME = "picture.db";
  24.      //数据库版本号
  25.      private static final int DATABASE_Version = 1;
  26.      //表名
  27.      private static final String TABLE_NAME = "picture";
  28.      
  29.      //创建数据库
  30.      public PictureDatabase (Context context) {
  31.          super(context, DATABASE_NAME, null, DATABASE_Version);
  32.          this.mContext = context;
  33.      }

  34.      //创建表并初始化表
  35.      @Override
  36.      public void onCreate (SQLiteDatabase db) {
  37.          String sql = "Create table " + TABLE_NAME + "(" + BaseColumns._ID
  38.          + " integer primary key autoincrement," + PictureColumns.PICTURE
  39.          + " blob not null);";
  40.          db.execSQL(sql);
  41.          
  42.          //初始化
  43.          initDataBase(db,mContext);
  44.      }
  45.      
  46.      //将转换后的图片存入到数据库中
  47.      private void initDataBase (SQLiteDatabase db, Context context) {
  48.          Drawable drawable = context.getResources().getDrawable(R.drawable.test_icon_resizer);
  49.          ContentValues cv = new ContentValues();
  50.          cv.put(PictureColumns.PICTURE, getPicture(drawable));
  51.          db.insert(TABLE_NAME, null, cv);
  52.      }

  53.      //将drawable转换成可以用来存储的byte[]类型
  54.      private byte[] getPicture(Drawable drawable) {
  55.          if(drawable == null) {
  56.              return null;
  57.          }
  58.          BitmapDrawable bd = (BitmapDrawable) drawable;
  59.          Bitmap bitmap = bd.getBitmap();
  60.          ByteArrayOutputStream os = new ByteArrayOutputStream();
  61.          bitmap.compress(CompressFormat.PNG, 100, os);
  62.          return os.toByteArray();
  63.      }
  64.      
  65.      //更新数据库
  66.      @Override
  67.      public void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion) {
  68.          String sql = " DROP TABLE IF EXISTS " + TABLE_NAME;
  69.          db.execSQL(sql);
  70.          onCreate(db);
  71.      } 
  72. }
代码注释的比较详细.
  这里重点要说的是初始化数据库的时候,将Drawable转变成byte[]的时候,先讲Drawable转换成Bitmap,然后将Bitmap存入字节数据输出流,从输出流里获取byte[]数组。

   ByteArrayOutputStream os = new ByteArrayOutputStream();
        bitmap.compress(CompressFormat.PNG, 100, os);
        return os.toByteArray();

  之后将字符数组存入到类型为blob的数据库中去。

   ContentValues cv = new ContentValues();
        cv.put(PictureColumns.PICTURE, getPicture(drawable));
        db.insert(TABLE_NAME, null, cv);

  之后在代码中从数据库中取出byte[],然后转换成Drawable,设置图片即可。

  代码如下:

  1. package com.android.test;

  2. import java.util.ArrayList;

  3. import android.app.Activity;
  4. import android.database.Cursor;
  5. import android.database.sqlite.SQLiteDatabase;
  6. import android.graphics.Bitmap;
  7. import android.graphics.BitmapFactory;
  8. import android.graphics.drawable.BitmapDrawable;
  9. import android.graphics.drawable.Drawable;
  10. import android.os.Bundle;
  11. import android.widget.ImageView;

  12. public class TestPicture extends Activity {
  13.      
  14.      @Override
  15.      protected void onCreate (Bundle savedInstanceState) {
  16.          super.onCreate(savedInstanceState);
  17.          ImageView iv = new ImageView(this);
  18.          if(getDrawable().size() != 0) {
  19.              iv.setImageDrawable(getDrawable().get(0));
  20.          }
  21.          setContentView(iv);
  22.      }
  23.      
  24.      
  25.      private ArrayList getDrawable() {
  26.          PictureDatabase pd = new PictureDatabase(this);
  27.          SQLiteDatabase sd = pd.getWritableDatabase();
  28.          
  29.          ArrayList drawables = new ArrayList();
  30.          
  31.          //查询数据库
  32.          Cursor c = sd.query("picture", null, null, null, null, null, null);
  33.          
  34.          //遍历数据
  35.          if(c != null && c.getCount() != 0) {
  36.              while(c.moveToNext()) {
  37.                  //获取数据
  38.                  byte[] b = c.getBlob(c.getColumnIndexOrThrow(PictureDatabase.PictureColumns.PICTURE));
  39.                  //将获取的数据转换成drawable
  40.                  Bitmap bitmap = BitmapFactory.decodeByteArray(b, 0, b.length, null);
  41.                  BitmapDrawable bitmapDrawable = new BitmapDrawable(bitmap);
  42.                  Drawable drawable = bitmapDrawable;
  43.                  drawables.add(drawable);
  44.              }
  45.          }
  46.          return drawables;
  47.      }
  48. }
重点注意如何将数据库中取出的byte[]转换成drawable:

  1.  Bitmap bitmap = BitmapFactory.decodeByteArray(b, 0, b.length, 
  2. null);
  3.                 BitmapDrawable bitmapDrawable = new BitmapDrawable(bitmap);
  4.                 Drawable drawable = bitmapDrawable;

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值