You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 19:06:00