如何从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
相关产品推荐
相关产品推荐

