2013-07-29 91 views
-4

我似乎無法弄清楚如何從通過java創建的sqlite數據庫中刪除記錄。我試圖用主ID來識別記錄,但我只是不斷收到空指針異常。我的繼承人代碼:使用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並將其指向該行,並說明爲什麼此連接= DriverManager.getConnection();'行註釋? – Smit

+0

你有調試器嗎? –

+2

請刪除雙倍間距,以便我不必滾動這麼多來閱讀您的代碼。應該使用空白區域來使其他人更容易閱讀代碼。 –

回答

1

connection是在你的刪除方法無效,你爲什麼不得到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(); 

你的代碼在你的刪除方法其餘的看起來不錯,你只需要您的連接初始化變量的東西。

一個可能的解決方案是該變量存儲在方法領域,而不是一個局部變量,當你初始化它在你的actionPerformed方法:

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

那麼你可以使用:

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

這將重新使用以前初始化的連接。 (重新使用連接對象是個好主意)

+0

哦,好的。我想我現在修好了。我不再獲得空指針異常,但我的主要ID爲3的條目仍然存在。刪除(3);沒有工作。我仍然看到數據庫中的條目我重新更新了我最初發布的代碼 – Jason

+0

我得到它的工作感謝您的幫助! – Jason

+0

請注意並標記我的答案,如果它有幫助。 –