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

如何从Android应用向SQL数据库发送数据?实现遇阻求助

嘿,我看你在Android自主开发时,往SQL数据库插数据遇到不少坑了,先拆解下你这段代码里的核心问题,再给你一个靠谱的解决方案:

你的代码里的几个关键问题
  • SQL语法错误:字符串类型的字段(比如date、title、description)没加单引号,数据库会把这些值当成列名或者无效语法,直接执行肯定报错;而且你的SQL语句还没写完,结尾缺了闭合括号和分号。
  • SQL注入风险:直接把值拼进SQL字符串里,要是后续用户输入的内容带特殊字符(比如单引号、分号),不仅会崩,还可能被恶意攻击篡改数据库。
  • 资源泄漏:获取了Connection但没在finally块里关闭,会导致数据库连接一直占用,消耗系统资源。
修正后的正确写法(用PreparedStatement)

这是Android操作数据库的标准安全写法,能避免上面的所有问题:

public void onUploadTest(View v) {
    Connection con = null;
    PreparedStatement pstmt = null;
    try {
        con = connectionClass.Conn();
        // 用占位符?替代具体值,彻底避免SQL注入和语法错误
        String query = "INSERT INTO photo (photoID, userID, date, title, description, location, selected) VALUES (?, ?, ?, ?, ?, ?, ?)";
        pstmt = con.prepareStatement(query);
        
        // 按顺序给占位符赋值(索引从1开始)
        pstmt.setInt(1, 100);          // photoID
        pstmt.setInt(2, 2);            // userID
        pstmt.setString(3, "2018-04-17"); // 建议用数据库兼容的日期格式(yyyy-MM-dd)
        pstmt.setString(4, "awesome"); // title
        pstmt.setString(5, "yep...");  // description
        pstmt.setString(6, "你的位置信息"); // location
        pstmt.setBoolean(7, true);     // selected(如果是布尔类型,根据实际字段类型调整)

        // 执行插入操作
        int affectedRows = pstmt.executeUpdate();
        if (affectedRows > 0) {
            Toast.makeText(v.getContext(), "数据上传成功!", Toast.LENGTH_SHORT).show();
        }
    } catch (SQLException e) {
        e.printStackTrace();
        Toast.makeText(v.getContext(), "上传失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
    } finally {
        // 必须关闭资源,先关PreparedStatement再关Connection
        try {
            if (pstmt != null) pstmt.close();
            if (con != null) con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
额外提醒
  • 如果是本地SQLite数据库,其实Android自带的SQLiteOpenHelper比直接用JDBC更适配Android平台,不用自己写连接类,还能自动处理数据库版本升级。
  • 如果是远程数据库,绝对不能在主线程执行网络请求,得用协程(Coroutine)、AsyncTask或者RxJava,不然会触发NetworkOnMainThreadException。
  • 日期格式尽量用yyyy-MM-dd,大部分数据库都能识别这个标准格式,避免因格式不兼容导致插入失败。

内容的提问来源于stack exchange,提问作者flyingtornado65

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:26:25