在Android开发中,有时我们需要将图片数据存储到数据库中,虽然这不是最优的解决方案,因为数据库不是设计用来存储大量二进制数据(如图片)的,但特定情况下可能无法避免。以下是一个实现将图片转换为byte[]数组存储到SQLite数据库,然后从数据库中取出并还原为图片的详细步骤。 我们需要创建一个SQLite数据库来存储图片数据。这通常通过创建一个SQLiteOpenHelper的子类来完成。例如: ```java public class PictureDatabase extends SQLiteOpenHelper { // 数据库字段 public static class PictureColumns implements BaseColumns { public static final String PICTURE = "picture"; } // 数据库相关常量 private Context mContext; private static final String DATABASE_NAME = "picture.db"; private static final int DATABASE_VERSION = 1; private static final String TABLE_NAME = "picture"; // 构造函数 public PictureDatabase(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); this.mContext = context; } // 创建表 @Override public void onCreate(SQLiteDatabase db) { String sql = "CREATE TABLE " + TABLE_NAME + "(" + BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + PictureColumns.PICTURE + " BLOB NOT NULL)"; db.execSQL(sql); // 初始化数据 initDataBase(db, mContext); } // 初始化数据库,将图片插入表中 private void initDataBase(SQLiteDatabase db, Context context) { // 获取图片资源 Drawable drawable = context.getResources().getDrawable(R.drawable.test_icon_resizer); ContentValues cv = new ContentValues(); cv.put(PictureColumns.PICTURE, getPicture(drawable)); db.insert(TABLE_NAME, null, cv); } // 将Drawable转换为byte[] private byte[] getPicture(Drawable drawable) { // 将BitmapDrawable转换为Bitmap Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap(); // 创建 ByteArrayOutputStream 并压缩图片 ByteArrayOutputStream stream = new ByteArrayOutputStream(); bitmap.compress(CompressFormat.JPEG, 100, stream); // 压缩格式与质量 return stream.toByteArray(); } } ``` 上述代码中,`onCreate()`方法创建了一个名为"picture"的表,包含两个字段:一个自增的_id主键和一个用于存储图片数据的BLOB字段。`initDataBase()`方法则负责将图片数据插入到表中。`getPicture()`方法用于将Drawable对象转换为可以存储的byte[]数组。 接下来,从数据库中读取图片并恢复为Bitmap: ```java public Bitmap getPictureFromDatabase(Context context) { SQLiteDatabase db = new PictureDatabase(context).getWritableDatabase(); Cursor cursor = db.query(TABLE_NAME, new String[]{PictureColumns.PICTURE}, null, null, null, null, null); if (cursor.moveToFirst()) { byte[] imageBytes = cursor.getBlob(0); cursor.close(); db.close(); // 使用 ByteArrayInputStream 和 BitmapFactory 解码 byte[] 为 Bitmap ByteArrayInputStream is = new ByteArrayInputStream(imageBytes); return BitmapFactory.decodeStream(is); } else { cursor.close(); db.close(); return null; } } ``` 这个`getPictureFromDatabase()`方法打开数据库,查询图片数据,然后使用BitmapFactory的`decodeStream()`方法将从数据库读取的byte[]数据解码为Bitmap对象。最后关闭游标和数据库连接。 需要注意的是,将图片数据存储在数据库中可能会导致数据库文件增大,影响应用性能和存储空间。更推荐的做法是将图片存储在外部存储(如SD卡)或使用ContentProvider结合MediaStore来管理图片,只在数据库中存储图片的路径或URI。然而,在特定场景下,如小规模图片数据的本地存储,这种做法仍有一定的实用性。
- 粉丝: 3
- 资源: 921
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助