android将图片转换存到数据库再从数据库读取转换成图片实现代码
首先,我们要把图片存入到数据库中,首先要创建一个数据库,如下所示:
packagecom.android.test;
importjava.io.ByteArrayOutputStream;
importandroid.content.ContentResolver;
importandroid.content.ContentValues;
importandroid.content.Context;
importandroid.database.sqlite.SQLiteDatabase;
importandroid.database.sqlite.SQLiteOpenHelper;
importandroid.graphics.Bitmap;
importandroid.graphics.Bitmap.CompressFormat;
importandroid.graphics.drawable.BitmapDrawable;
importandroid.graphics.drawable.Drawable;
importandroid.provider.BaseColumns;
publicclassPictureDatabaseextendsSQLiteOpenHelper{
//数据库的字段
publicstaticclassPictureColumnsimplementsBaseColumns{
publicstaticfinalStringPICTURE="picture";
}
privateContextmContext;
//数据库名
privatestaticfinalStringDATABASE_NAME="picture.db";
//数据库版本号
privatestaticfinalintDATABASE_Version=1;
//表名
privatestaticfinalStringTABLE_NAME="picture";
//创建数据库
publicPictureDatabase(Contextcontext){
super(context,DATABASE_NAME,null,DATABASE_Version);
this.mContext=context;
}
//创建表并初始化表
@Override
publicvoidonCreate(SQLiteDatabasedb){
Stringsql="Createtable"+TABLE_NAME+"("+BaseColumns._ID
+"integerprimarykeyautoincrement,"+PictureColumns.PICTURE
+"blobnotnull);";
db.execSQL(sql);
//初始化
initDataBase(db,mContext);
}
//将转换后的图片存入到数据库中
privatevoidinitDataBase(SQLiteDatabasedb,Contextcontext){
Drawabledrawable=context.getResources().getDrawable(R.drawable.test_icon_resizer);
ContentValuescv=newContentValues();
cv.put(PictureColumns.PICTURE,getPicture(drawable));
db.insert(TABLE_NAME,null,cv);
}
//将drawable转换成可以用来存储的byte[]类型
privatebyte[]getPicture(Drawabledrawable){
if(drawable==null){
returnnull;
}
BitmapDrawablebd=(BitmapDrawable)drawable;
Bitmapbitmap=bd.getBitmap();
ByteArrayOutputStreamos=newByteArrayOutputStream();
bitmap.compress(CompressFormat.PNG,100,os);
returnos.toByteArray();
}
//更新数据库
@Override
publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){
Stringsql="DROPTABLEIFEXISTS"+TABLE_NAME;
db.execSQL(sql);
onCreate(db);
}
}
代码注释的比较详细.
这里重点要说的是初始化数据库的时候,将Drawable转变成byte[]的时候,先讲Drawable转换成Bitmap,然后将Bitmap存入字节数据输出流,从输出流里获取byte[]数组。
ByteArrayOutputStreamos=newByteArrayOutputStream();
bitmap.compress(CompressFormat.PNG,100,os);
returnos.toByteArray();
之后将字符数组存入到类型为blob的数据库中去。
ContentValuescv=newContentValues();
cv.put(PictureColumns.PICTURE,getPicture(drawable));
db.insert(TABLE_NAME,null,cv);
之后在代码中从数据库中取出byte[],然后转换成Drawable,设置图片即可。
代码如下:
importjava.util.ArrayList; importandroid.app.Activity; publicclassTestPictureextendsActivity{ 重点注意如何将数据库中取出的byte[]转换成drawable: 运行效果如下:
packagecom.android.test;
importandroid.database.Cursor;
importandroid.database.sqlite.SQLiteDatabase;
importandroid.graphics.Bitmap;
importandroid.graphics.BitmapFactory;
importandroid.graphics.drawable.BitmapDrawable;
importandroid.graphics.drawable.Drawable;
importandroid.os.Bundle;
importandroid.widget.ImageView;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
ImageViewiv=newImageView(this);
if(getDrawable().size()!=0){
iv.setImageDrawable(getDrawable().get(0));
}
setContentView(iv);
}
privateArrayList<Drawable>getDrawable(){
PictureDatabasepd=newPictureDatabase(this);
SQLiteDatabasesd=pd.getWritableDatabase();
ArrayList<Drawable>drawables=newArrayList<Drawable>();
//查询数据库
Cursorc=sd.query("picture",null,null,null,null,null,null);
//遍历数据
if(c!=null&&c.getCount()!=0){
while(c.moveToNext()){
//获取数据
byte[]b=c.getBlob(c.getColumnIndexOrThrow(PictureDatabase.PictureColumns.PICTURE));
//将获取的数据转换成drawable
Bitmapbitmap=BitmapFactory.decodeByteArray(b,0,b.length,null);
BitmapDrawablebitmapDrawable=newBitmapDrawable(bitmap);
Drawabledrawable=bitmapDrawable;
drawables.add(drawable);
}
}
returndrawables;
}
}
Bitmapbitmap=BitmapFactory.decodeByteArray(b,0,b.length,null);
BitmapDrawablebitmapDrawable=newBitmapDrawable(bitmap);
Drawabledrawable=bitmapDrawable;
相关文章