我的插入方法有什么问题?

时间:2015-05-08 15:19:15

标签: java android arraylist

我正在尝试将一些数据插入数据库。为了实现这一目标,我创建了一个方法,该方法返回boolean并接收ArrayList Objects类型Point。一切都运行良好,直到我检查我的表,我发现它只是插入了一个点(每次的第一个点),虽然我有很多点(arrayList.size() > 0)。如果我的arrayList.get(2).getXcoordinate(),我可以达到arrayList.size(2),但我的方法只插入第一个索引(arrayList.size(0))。 我根本无法弄清楚我做错了什么。任何帮助或提示非常感谢。谢谢,卡尔 - 我的方法:

public boolean insertPoints(ArrayList<Point> arr) {
       try {
            con = this.getConnection();
            st = con.createStatement();
            if (con != null) {
                for (int i = 0; i < arr.size(); i++) {
                    String id = arr.get(i).getId();
                    String x = arr.get(i).getXcoordinate();
                    String y = arr.get(i).getYcoordinate();
                    if (st.executeUpdate("INSERT INTO table (Id, X, Y)
                                 VALUES (" + id + "," + x + "," + y + ")") > 0)
                        return true;
                    return false;
                }
            } else {
                System.err.println("No connection, con == null ...");
                return false;
            }
        } catch (Exception e) {
            System.err.println("Exception: " + e.getMessage());
            return false;
        } finally {
            try {
                if (rs != null) rs.close();
                if (st != null) st.close();
                if (con != null) con.close();
            } catch (SQLException sqle) {
                System.err.println("SQLException: " + sqle.getMessage());
            }
        }
         return false;
     }

4 个答案:

答案 0 :(得分:2)

此代码不是您应该这样做的方式。

请使用PreparedStatement绑定变量。

您的ConnectionPreparedStatement不应该是班级成员。 Connection应该在其他地方实例化并传入。

PreparedStatement应具有本地范围。

您应该在finally方法中关闭各个try / catch块中的资源。编写静态方法以重用并保持代码较小。

您也可以考虑批量调用这些调用,以便在一次往返中插入所有点。它会更高效。

// Your table's name is table?  Terrible.
private static final String INSERT_SQL = "INSERT INTO table(Id, X, Y) VALUES (?, ?, ?)";

答案 1 :(得分:1)

以下内容:

if (st.executeUpdate("INSERT INTO table (Id, X, Y) VALUES (" + id + "," + x + "," + y + ")") > 0)
    return true;
return false;
插入第一个值后

将退出该方法,根据executeUpdate的返回值返回true或false。

也许更像是这样的东西

 for (int i = 0; i < arr.size(); i++) {
      String id = arr.get(i).getId();
      String x = arr.get(i).getXcoordinate();
      String y = arr.get(i).getYcoordinate();
      if (!st.executeUpdate("INSERT INTO table (Id, X, Y) VALUES (" + id + "," + x + "," + y + ")") > 0)
          return false;
 }
 return true;

答案 2 :(得分:1)

这是有问题的

if (st.executeUpdate("INSERT INTO table (Id, X, Y)
                                 VALUES (" + id + "," + x + "," + y + ")") > 0)
                        return true;
                    return false;

只需删除return语句并使用标志或计数器

答案 3 :(得分:-1)

试试这个:

public boolean insertPoints(ArrayList<Point> arr)
    {
        try
        {
            con = this.getConnection();
            st = con.createStatement();
            if (con != null)
            {
                boolean success = true;
                for (int i = 0; i < arr.size(); i++)
                {
                    String id = arr.get(i).getId();
                    String x = arr.get(i).getXcoordinate();
                    String y = arr.get(i).getYcoordinate();
                    if (st.executeUpdate("INSERT INTO table (Id, X, Y) VALUES (" + id + "," + x + "," + y + ")") > 0)
                    {
                        continue;
                    }
                    else
                    {
                        success = false;
                        break;
                    }
                }
                return success;
            }
            else
            {
                System.err.println("No connection, con == null ...");
                return false;
            }
        }
        catch (Exception e)
        {
            System.err.println("Exception: " + e.getMessage());
            return false;
        }
        finally
        {
            try
            {
                if (rs != null) rs.close();
                if (st != null) st.close();
                if (con != null) con.close();
            }
            catch (SQLException sqle)
            {
                System.err.println("SQLException: " + sqle.getMessage());
            }
        }
        return false;
    }