2013-07-29 5 views
-4

java를 통해 생성 된 sqlite 데이터베이스에서 레코드를 삭제하는 방법을 알 수없는 것 같습니다. 기본 ID로 레코드를 식별하려고했지만 null 포인터 예외가 계속 발생했습니다. Heres는 내 코드 :Java를 사용하여 sqlite 데이터베이스에서 레코드 삭제

package userinterface; 

    import javax.swing.JFrame; 

    import java.awt.FlowLayout; 

    import javax.swing.JButton; 

    import javax.swing.JDialog; 

    import javax.swing.JLabel; 

    import javax.swing.JOptionPane; 

    import javax.swing.JTextField; 

    import backend.SQLiteDb; 

    import business.Person; 

    import java.awt.event.ActionListener; 

    import java.awt.event.ActionEvent; 

    import java.awt.BorderLayout; 
    import java.sql.Connection; 
    import java.sql.DriverManager; 
    import java.sql.PreparedStatement; 
    import java.sql.ResultSet; 
    import java.sql.SQLException; 
    import java.sql.Statement; 

    public class GUI { 

     static SQLiteDb db; 

     public static void main(String[] args) { 

      final JFrame jframe = new JFrame(); 

      JButton btnEnterInfo = new JButton("Enter Info"); 

      jframe.getContentPane().add(btnEnterInfo, BorderLayout.CENTER); 

      jframe.setVisible(true); 

      jframe.setSize(300, 300); 

      btnEnterInfo.addActionListener(new ActionListener() { 

       public void actionPerformed(ActionEvent e) { 

        JLabel fullName = new JLabel("Full Name: "); 

        JTextField nameField = new JTextField(); 

        JLabel age = new JLabel("Age: "); 

        JTextField ageField = new JTextField(); 

        JLabel address = new JLabel("Address: "); 

        JTextField addressField = new JTextField(); 

        JLabel salary = new JLabel("Salary: "); 

        JTextField salaryField = new JTextField(); 

        Object[] ob = { fullName, nameField, age, ageField, address, 
          addressField, 

          salary, salaryField }; 

        int result = JOptionPane.showConfirmDialog(null, ob, "Part 5", 

        JOptionPane.OK_CANCEL_OPTION); 

        jframe.getContentPane().setLayout(new FlowLayout()); 

        if (result == JOptionPane.OK_OPTION) { 

         db = new SQLiteDb(); 

         db.createPersonnelTable(); 
         String fullName1 = nameField.getText(); 
         String userAge = ageField.getText(); 
         String userAddress = addressField.getText(); 
         String userSalary = salaryField.getText(); 
         Person person = new Person(fullName1, Integer 
           .parseInt(userAge), userAddress, 

         Double.parseDouble(salaryField.getText())); 

         db.addPerson(person); 

         String sql = "SELECT * FROM COMPANY"; 

         Statement stmt = null; 

         try { 
          java.sql.Statement s; 

          Connection connection = DriverManager 
         .getConnection("JDBC:sqlite:Andy.db"); 
          stmt = connection.createStatement(); 
          ResultSet rs = stmt.executeQuery(sql); 

          while (rs.next()) { 
           int id_col = rs.getInt("ID"); 
           String name = rs.getString("name"); 
           int age1 = rs.getInt("Age"); 
           String address1 = rs.getString("Address"); 
           double salary1 = rs.getInt("Salary"); 

           String output = id_col + " " + name + " " + age1 
             + " " + address1 + " " + salary1; 
           System.out.println(output); 

          } 
          delete(3); 
          rs.close(); 
         } catch (SQLException ee) { 
          System.out.println("ee error"); 
          ee.printStackTrace(); 

         } finally { 
          if (stmt != null) { 
           try { 
            stmt.close(); 

           } catch (SQLException e1) { 
            // TODO Auto-generated catch block 
            System.out.println("e1 error"); 
            e1.printStackTrace(); 

           } 
          } 

         } 

        } 

       } 
      }); 

     } 

     public static void viewTable(Connection con, String dbName) 
       throws SQLException { 

     } 

     public static void delete(int id) { 
      Connection connection = null; 
      PreparedStatement preparedStatement = null; 
      try { 
       // connection = DriverManager.getConnection(); 
       preparedStatement = connection.prepareStatement("DELETE FROM person WHERE id = ?"); 
       preparedStatement.setInt(1, id); 
       preparedStatement.executeUpdate(); 

       System.out.println("DELETE FROM person WHERE id = ?"); 
      } catch (Exception eeee) { 
       eeee.printStackTrace(); 

      } finally { 
       if (preparedStatement != null) { 
        try { 
         preparedStatement.close(); 
        } catch (SQLException e) { 
         e.printStackTrace(); 
        } 

       } 
       if (connection != null) { 
        try { 
         connection.close(); 
        } catch (SQLException e) { 
         e.printStackTrace(); 

        } 

       } 
      }}} 
+2

Jason 내 친구 stackstrace를 추가하고 그 줄을 알려주십시오. 왜이'// connection = DriverManager.getConnection();'줄이 주석 처리 되었습니까? – Smit

+0

디버거를 편리하게 사용합니까? –

+2

코드를 읽을 정도로 스크롤 할 필요가 없도록 이중 간격을 제거하십시오. 공백은 다른 사람들이 읽기 쉬운 코드를 작성하는 데 사용해야합니다. –

답변

1

connection이 삭제 방법 null의 경우, 당신은 왜 NullPointerException이 얻을 것 없다?

당신의 삭제 방법에 코드의 나머지가 좋아 보인다
Connection connection = null; 
    PreparedStatement preparedStatement = null; 
    try { 
     // connection = DriverManager.getConnection(); <--- !!!! This line is commented for some reason, so it is not executed! 
     preparedStatement = connection.prepareStatement("DELETE FROM person WHERE id = ?"); 
     preparedStatement.setInt(1, id); 
     preparedStatement.executeUpdate(); 

, 당신은 뭔가에 연결 변수를 초기화해야합니다.

this.connection = DriverManager 
          .getConnection("JDBC:sqlite:Andy.db"); 

은 그럼 당신은 사용할 수 있습니다 :

preparedStatement = this.connection.prepareStatement("DELETE FROM person WHERE id = ?"); 

가능한 해결책은 당신이 당신의 actionPerformed 방법을 초기화 할 때 대신 지역 변수의 방법 필드에이 변수를 저장하는 것입니다 이전에 초기화 된 연결을 다시 사용합니다. (연결 객체를 재사용하는 것이 좋습니다)

+0

오케이. 나는 그것을 지금 고쳤다 고 생각한다. 나는 더 이상 null 포인터 예외를 얻지 만 primary id가 3 인 항목은 여전히 ​​존재합니다. 삭제 (3); 작동하지 않습니다. 난 여전히 데이터베이스에서 항목을 참조하십시오 내가 원래 위에 게시 된 코드를 다시 업데이 트 – Jason

+0

난 당신의 도움을 위해 일하고있어! – Jason

+0

제 답변을 도와 주시면 승인을 해주시기 바랍니다. –

관련 문제