Android中使用INSERT INTO存储用户选择图片至SQLite失败求助
搞定Android图片存SQLite的问题!
嘿,我来帮你解决这个图片存数据库失败的问题~你现在是用INSERT INTO语句存Blob类型的图片没成功,结合你的代码情况,咱们一步步来排查和修正:
先避开execSQL的坑,用更稳妥的方式
直接手写INSERT语句很容易因为参数类型匹配、空值处理出问题,Android的SQLiteDatabase提供的insert()方法+ContentValues会自动帮你处理Blob类型的参数,容错性更强,优先用这个方式。
先确认图片转byte[]的方法没问题
你的profileImage(bitmap)要是转码出错,得到的byte数组为空或者格式不对,肯定存不进去。给你一个标准的Bitmap转byte[]的写法,替换你原来的方法试试:
private byte[] bitmapToByteArray(Bitmap bitmap) { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); // 这里可以选JPEG或PNG,PNG无损但体积大,按需选择 bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream); return outputStream.toByteArray(); }
检查数据库表的字段类型
确保你的books表中photoBook字段确实是BLOB类型,创建表的SQL得是这样的:
CREATE TABLE IF NOT EXISTS books ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, photoBook BLOB );
修正你的addBook()方法
把原来的execSQL写法改成下面的实现,逻辑更清晰也更可靠:
private void addBook() { // 先判断Bitmap是否为空(用户有没有选图片) if (bitmap == null) { Toast.makeText(this, "请先选择图片哦", Toast.LENGTH_SHORT).show(); return; } // 把Bitmap转成byte数组 Myphoto = bitmapToByteArray(bitmap); // 封装要插入的数据 ContentValues contentValues = new ContentValues(); contentValues.put("name", "替换成你的书名变量"); // 这里换成你实际的name值 contentValues.put("photoBook", Myphoto); // 执行插入,返回的result是插入行的ID,-1就是失败了 long insertResult = mDatabase.insert("books", null, contentValues); if (insertResult != -1) { Toast.makeText(this, "图书添加成功!", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "添加失败,正在排查...", Toast.LENGTH_SHORT).show(); // 如果还是失败,捕获异常看具体错误 try { // 用execSQL再试一次,同时捕获异常 String insertSql = "INSERT INTO books (name, photoBook) VALUES (?, ?);"; mDatabase.execSQL(insertSql, new Object[]{"测试书名", Myphoto}); } catch (SQLiteException e) { // 打印错误信息,方便排查 Log.e("DB_ERROR", "插入失败原因:" + e.getMessage()); e.printStackTrace(); } } }
关键提示:一定要看错误日志
如果还是存不进去,别瞎猜!捕获SQLiteException打印堆栈信息,日志里会明确告诉你是字段类型不匹配、参数为空,还是表结构有问题(比如你写的photoBook是不是和表中的字段名完全一致?)。
内容的提问来源于stack exchange,提问作者SaKH
相关产品推荐
相关产品推荐

