Android Studio开发APP从自托管SQL数据库读取显示图片问题求助
问题修复方案
核心错误点
ResultSet.getByte(int columnIndex)只能返回单个字节值,你存的image类型是二进制数组,需要调用getBytes()方法获取完整字节数组- 你注释的图片读取代码逻辑错误:
while(set.next())已经将游标移动到匹配行,后续再调用set.next()会直接跳到下一行,没有数据就会返回空 - 数据库操作属于耗时/网络操作,直接写在主线程的点击事件里,高版本Android会直接抛出主线程网络异常,导致代码执行失败
- SQL语句拼接存在SQL注入风险,且ID为int类型不需要加单引号包裹
修复步骤
首先导入缺失的依赖类:
import java.sql.PreparedStatement; import android.widget.Toast;
替换update.setOnClickListener内的全部逻辑:
update.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String loadData = Rnumber.getText().toString(); // 校验输入非空 if (loadData.isEmpty()) { Toast.makeText(MainActivity.this, "请输入ID", Toast.LENGTH_SHORT).show(); return; } // 数据库操作必须放在子线程执行 new Thread(() -> { ConSQL con = new ConSQL(); connection = con.conclass(); // 校验数据库连接是否有效,而非校验con实例 if (connection != null) { try { // 用PreparedStatement防止SQL注入 String sqlstatement = "Select * From DatabasePictures where ID=?"; PreparedStatement smt = connection.prepareStatement(sqlstatement); smt.setInt(1, Integer.parseInt(loadData)); ResultSet set = smt.executeQuery(); // 单条匹配用if即可,无需while if (set.next()) { String getName = set.getString(2); String getPath = set.getString(3); // 读取图片完整二进制数组 byte[] imageBytes = set.getBytes(4); Bitmap bitmap = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length); // 主线程才能更新UI runOnUiThread(() -> { name.setText(getName); path.setText(getPath); if (bitmap != null) { picture.setImageBitmap(bitmap); } else { Toast.makeText(MainActivity.this, "图片解析失败", Toast.LENGTH_SHORT).show(); } }); } else { runOnUiThread(() -> Toast.makeText(MainActivity.this, "未找到对应数据", Toast.LENGTH_SHORT).show()); } connection.close(); } catch (Exception e) { // 打印完整错误堆栈方便排查 Log.e("SQL读取错误", e.getMessage(), e); runOnUiThread(() -> Toast.makeText(MainActivity.this, "读取失败:" + e.getMessage(), Toast.LENGTH_SHORT).show()); } } else { runOnUiThread(() -> Toast.makeText(MainActivity.this, "数据库连接失败", Toast.LENGTH_SHORT).show()); } }).start(); } });
额外注意事项
- 如果读取出来的
imageBytes转Bitmap还是为空,确认你存图片到数据库的时候有没有做Base64编码,如果编码了,读取的时候需要先Base64解码再转Bitmap - SQL Server的
image类型已经被标记为过时,后续建议换成varbinary(max)类型存储二进制数据 - 如果图片体积过大,建议不要直接存在数据库里,存文件路径到
Filepath字段,直接读本地文件加载图片性能更好
内容的提问来源于stack exchange,提问作者mr_laut
相关产品推荐
相关产品推荐

