Android:如何将相机/外部存储图片存入SQLite并读取?需修改onActivityResult
嘿,我来帮你搞定相机拍摄图片存入SQLite并读取的问题!先聚焦你问的onActivityResult修改,再一步步讲存、取的完整实现,都是实打实的代码示例,直接能用~
一、修改onActivityResult获取拍摄的图片
首先,你在调用相机的Activity里,onActivityResult要先拿到拍摄后的图片路径(或Bitmap),再转成字节数组——因为SQLite里存图片用的是BLOB类型,只能存字节流。给你改好的示例:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // 假设你之前定义的相机请求码是REQUEST_IMAGE_CAPTURE if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { // 推荐:用你之前指定的存储路径获取图片文件(避免Bitmap过大) File imageFile = new File(你预先设置的图片存储路径); if (imageFile.exists()) { // 转成字节数组 byte[] imageBytes = getImageBytesFromFile(imageFile); // 调用数据库插入方法 yourDbHelper.insertImage(imageBytes); Toast.makeText(this, "图片已存入数据库", Toast.LENGTH_SHORT).show(); } // 备选:如果用相机默认返回的缩略图(清晰度低,不推荐大场景) // Bitmap thumbnailBitmap = (Bitmap) data.getExtras().get("data"); // byte[] imageBytes = getImageBytesFromBitmap(thumbnailBitmap); // yourDbHelper.insertImage(imageBytes); } } // 辅助方法:将图片文件转成字节数组 private byte[] getImageBytesFromFile(File file) { try (FileInputStream fis = new FileInputStream(file)) { ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = fis.read(buffer)) != -1) { bos.write(buffer, 0, bytesRead); } return bos.toByteArray(); } catch (IOException e) { e.printStackTrace(); return null; } } // 辅助方法:将Bitmap转成字节数组 private byte[] getImageBytesFromBitmap(Bitmap bitmap) { ByteArrayOutputStream bos = new ByteArrayOutputStream(); // 80是压缩质量,范围0-100,数值越高清晰度越好 bitmap.compress(Bitmap.CompressFormat.JPEG, 80, bos); return bos.toByteArray(); }
二、SQLite数据库的准备(表结构+插入方法)
首先你的SQLiteOpenHelper子类里,要创建带BLOB字段的表,再写插入逻辑:
public class ImageDbHelper extends SQLiteOpenHelper { private static final String DB_NAME = "ImageStorage.db"; private static final int DB_VERSION = 1; private static final String TABLE_IMAGES = "captured_images"; private static final String COLUMN_ID = "_id"; private static final String COLUMN_IMAGE_BLOB = "image_data"; public ImageDbHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } @Override public void onCreate(SQLiteDatabase db) { String createTableSql = "CREATE TABLE " + TABLE_IMAGES + " (" + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COLUMN_IMAGE_BLOB + " BLOB)"; db.execSQL(createTableSql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 升级时删除旧表重建,实际项目可根据需求做数据迁移 db.execSQL("DROP TABLE IF EXISTS " + TABLE_IMAGES); onCreate(db); } // 插入图片到数据库的方法 public void insertImage(byte[] imageBytes) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(COLUMN_IMAGE_BLOB, imageBytes); db.insert(TABLE_IMAGES, null, values); db.close(); } }
三、从SQLite读取图片并显示
在数据库帮助类里加读取方法,把字节数组转回Bitmap,再显示到ImageView:
// 在ImageDbHelper里添加读取方法 public Bitmap getImageById(int imageId) { SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.query(TABLE_IMAGES, new String[]{COLUMN_IMAGE_BLOB}, COLUMN_ID + "=?", new String[]{String.valueOf(imageId)}, null, null, null); Bitmap targetBitmap = null; if (cursor.moveToFirst()) { byte[] imageBytes = cursor.getBlob(cursor.getColumnIndexOrThrow(COLUMN_IMAGE_BLOB)); targetBitmap = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length); } cursor.close(); db.close(); return targetBitmap; } // 在Activity里调用显示(比如读取ID为1的图片) ImageView displayIv = findViewById(R.id.image_display); Bitmap loadedBitmap = yourDbHelper.getImageById(1); if (loadedBitmap != null) { displayIv.setImageBitmap(loadedBitmap); }
一些实用提醒
- 优先用指定路径拍摄的方式,默认返回的是缩略图,清晰度不足
- 大图片存SQLite会让数据库体积暴涨,性能下降,如果是大量图片,更推荐只存图片路径到数据库,图片本身存在外部存储
- 记得处理权限:Android 10及以下需要
WRITE_EXTERNAL_STORAGE,Android 10+可以用APP私有目录存储(无需权限)
内容的提问来源于stack exchange,提问作者Music Backup
相关产品推荐
相关产品推荐

