c 将图片存入到mysql数据库中_如何将图片转换存入到数据库中,并从数据库中取出转换成图片...

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

首先,我们要把图片存入到数据库中,首先要创建一个数据库, 如下所示:

1 package com.android.test;

2

3 import java.io.ByteArrayOutputStream;

4

5 import android.content.ContentResolver;

6 import android.content.ContentValues;

7 import android.content.Context;

8 import android.database.sqlite.SQLiteDatabase;

9 import android.database.sqlite.SQLiteOpenHelper;

10 import android.graphics.Bitmap;

11 import android.graphics.Bitmap.CompressFormat;

12 import android.graphics.drawable.BitmapDrawable;

13 import android.graphics.drawable.Drawable;

14 import android.provider.BaseColumns;

15

16 public class PictureDatabase extends SQLiteOpenHelper {

17

18 //数据库的字段19 public static class PictureColumns implements BaseColumns {

20 public static final String PICTURE = "picture";

21 }

22

23 private Context mContext;

24

25 //数据库名26 private static final String DATABASE_NAME = "picture.db";

27 //数据库版本号28 private static final int DATABASE_Version = 1;

29 //表名30 private static final String TABLE_NAME = "picture";

31

32 //创建数据库33 public PictureDatabase (Context context) {

34 super(context, DATABASE_NAME, null, DATABASE_Version);

35 this.mContext = context;

36 }

37

38 //创建表并初始化表39 @Override

40 public void onCreate (SQLiteDatabase db) {

41 String sql = "Create table " + TABLE_NAME + "(" + BaseColumns._ID

42 + " integer primary key autoincrement," + PictureColumns.PICTURE

43 + " blob not null);";

44 db.execSQL(sql);

45

46 //初始化47 initDataBase(db,mContext);

48 }

49

50 //将转换后的图片存入到数据库中51 private void initDataBase (SQLiteDatabase db, Context context) {

52 Drawable drawable = context.getResources().getDrawable(R.drawable.test_icon_resizer);

53 ContentValues cv = new ContentValues();

54 cv.put(PictureColumns.PICTURE, getPicture(drawable));

55 db.insert(TABLE_NAME, null, cv);

56 }

57

58 //将drawable转换成可以用来存储的byte[]类型59 private byte[] getPicture(Drawable drawable) {

60 if(drawable == null) {

61 return null;

62 }

63 BitmapDrawable bd = (BitmapDrawable) drawable;

64 Bitmap bitmap = bd.getBitmap();

65 ByteArrayOutputStream os = new ByteArrayOutputStream();

66 bitmap.compress(CompressFormat.PNG, 100, os);

67 return os.toByteArray();

68 }

69

70 //更新数据库71 @Override

72 public void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion) {

73 String sql = " DROP TABLE IF EXISTS " + TABLE_NAME;

74 db.execSQL(sql);

75 onCreate(db);

76 }

77 }

代码注释的比较详细.

这里重点要说的是初始化数据库的时候,将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

3 import java.util.ArrayList;

4

5 import android.app.Activity;

6 import android.database.Cursor;

7 import android.database.sqlite.SQLiteDatabase;

8 import android.graphics.Bitmap;

9 import android.graphics.BitmapFactory;

10 import android.graphics.drawable.BitmapDrawable;

11 import android.graphics.drawable.Drawable;

12 import android.os.Bundle;

13 import android.widget.ImageView;

14

15 public class TestPicture extends Activity {

16

17 @Override

18 protected void onCreate (Bundle savedInstanceState) {

19 super.onCreate(savedInstanceState);

20 ImageView iv = new ImageView(this);

21 if(getDrawable().size() != 0) {

22 iv.setImageDrawable(getDrawable().get(0));

23 }

24 setContentView(iv);

25 }

26

27

28 private ArrayList getDrawable() {

29 PictureDatabase pd = new PictureDatabase(this);

30 SQLiteDatabase sd = pd.getWritableDatabase();

31

32 ArrayList drawables = new ArrayList();

33

34 //查询数据库35 Cursor c = sd.query("picture", null, null, null, null, null, null);

36

37 //遍历数据38 if(c != null && c.getCount() != 0) {

39 while(c.moveToNext()) {

40 //获取数据41 byte[] b = c.getBlob(c.getColumnIndexOrThrow(PictureDatabase.PictureColumns.PICTURE));

42 //将获取的数据转换成drawable43 Bitmap bitmap = BitmapFactory.decodeByteArray(b, 0, b.length, null);

44 BitmapDrawable bitmapDrawable = new BitmapDrawable(bitmap);

45 Drawable drawable = bitmapDrawable;

46 drawables.add(drawable);

47 }

48 }

49 return drawables;

50 }

51 }

重点注意如何将数据库中取出的byte[]转换成drawable:

Bitmap bitmap = BitmapFactory.decodeByteArray(b, 0, b.length, null);

BitmapDrawable bitmapDrawable = new BitmapDrawable(bitmap);

Drawable drawable = bitmapDrawable;

运行效果如下:

04c42d4b2be60a17a8b4a4f42b0f7ee4.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值