2017-07-17 40 views
0

嗯,我需要從數據庫中取值,並將它們插入到組合框中進行選擇。從數據庫解析數據到組合框

聽起來很容易使用2班,UI類實體類,其中包含裏面所有的SQL查詢來做到這(什麼關係數據庫,它在那裏):

//This is the UI class 

public void fillComboBox(){ 

    Entity et = new Entity(); 

    try{ 
     //call out dbConnector method from Entity class 
     conn = et.dbConnector(); 
     String query="select distinct Name from DbTable order by Name"; 
     PreparedStatement pst = conn.prepareStatement(query); 
     ResultSet rs = pst.executeQuery(); 

     while(rs.next()){ 
      //shows topic data in combobox 
      comboBoxName.addItem(rs.getString("Name")); 
     } 
    } 
    catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 
    //runs method 
     fillComboBox(); 

現在,上面的輸出可以正常工作,沒有任何故障。在我的表單中,組合框顯示從我指定列中的數據庫中取得的唯一值。

問題出現時,在其中實施其他層。

總之,我現在有三個班。

第1類:UI - >此類純粹處理UI

2類:控制器 - >此類純粹運行方法

3類:實體 - >此類純粹運行任何與sql數據庫查詢有關的事情

我所做的,就是修改上面的代碼,代碼如下:

這是UI類:

//Declare Variables 
JComboBox comboBoxName = new JComboBox(); 
Controller ct = new Controller(); 

comboBoxName.addItem(ct.fillComboBox()); 

和控制器類中的某個方法:

//Declare Variables 
Entity et = new Entity(); 

public String fillComboBox(){ 
    return et.takeNames(); 
} 

最後,我的實體類,其中包含內的所有SQL查詢。

//Declare all variables first 
Connection conn = null; 
String task = null, names = null; 
String query; 

//This method connects to database 
//There's nothing wrong with this method, I just placed it here to give a general overview of what this method exactly is for you to understand, as I will be calling it out later. Yes, I removed off the **URL** portion intentionally. 
public static Connection dbConnector(){  
    try{ 
     Class.forName("org.sqlite.JDBC"); 
     Connection conn = DriverManager.getConnection("jdbc:sqlite:URL"); 
     JOptionPane.showMessageDialog(null, "Connected!"); 
     return conn; 
    } 

    catch(Exception ex){ 
     JOptionPane.showMessageDialog(null, ex); 
     return null; 
    } 
} 

public String takeNames(){ 

     try{ 
      conn = dbConnector(); 
      query = "select distinct Name from DbTable order by Name"; 
      PreparedStatement pst = conn.prepareStatement(query); 
      ResultSet rs = pst.executeQuery(); 

      while(rs.next()){ 
       //shows Name data in combobox 
       names = rs.getString("Name"); 
      }    
      pst.close();     
     } 

     catch(Exception ex){ 
      ex.printStackTrace(); 
     } 

     return names; 
     } 

嗯,基本上,這是如何「新」的實施運行的是,在UI類召喚出Controller類,它調用了實體類,它運行的內部和分析方法返回值一直到用戶界面。

從分離程序的不同部分的角度來看,此方法非常有用,使其看起來更整齊。太糟糕了,這是一個頭痛的執行。 >。>

現在,這個錯誤將會是,它將只檢索1個值,而不是多個值。它所做的檢索是我指定的特定列中的第一個「獨特」值。其餘的「獨特」值將被忽略。

我有一種預感,它有一切做與RS設置,@:

ResultSet rs = pst.executeQuery(); 

我腦子裏想的是什麼,只需要1點的值,並將它,然後忽略其餘部分。有沒有人有任何解決方案?我嘗試了arraylist,但未能就如何在arraylist中存儲大量rs值(這真的讓我難倒了>。>)

我做了冗長的道歉後,但我盡力做了,直到我所能,我被困在這部分時間之前.....

+0

你能做些什麼像插入一些你面臨的問題的圖像頂部。這是一個文本牆的朋友。越早掌握這個問題的人就越有可能得到答案。一張圖片勝過千言萬語! – JGFMK

+0

我指定的特定列 - 具體說明... – JGFMK

+0

編碼器不需要運行註釋,您是如何編寫應用程序的。他們只需要看現在的代碼。他們可以理解代碼。如果您提供樣本數據表以及您得到的內容與想要澄清事物的內容! – JGFMK

回答

0

修改takeNames()作爲如下

public ArrayList<String> takeNames(){ 
     //This will collect all names from db 
     ArrayList<String> names = new ArrayList<>(); 

     try{ 
      conn = dbConnector(); 
      query = "select distinct Name from DbTable order by Name"; 
      PreparedStatement pst = conn.prepareStatement(query); 
      ResultSet rs = pst.executeQuery(); 

      while(rs.next()){ 
       //shows Name data in combobox 
       //Add data to the array list 
       names.add(rs.getString("Name")); 
      }    
      pst.close();     
     } 

     catch(Exception ex){ 
      ex.printStackTrace(); 
     } 

     //Return the array list you created 
     return names; 
     } 

修改fillComboBox()如下

public ArrayList<String> fillComboBox(){ 
    return et.takeNames(); 
} 

並修改其餘如下

JComboBox comboBoxName = new JComboBox(); 
Controller ct = new Controller(); 
ArrayList<String> nameList = ct.fillComboBox(); 

for(String name : nameList){ 
    comboBoxName.addItem(name);   
} 
+0

在UI中聲明一個數組並將其存儲在內,呵呵。整潔的想法!這工作,謝謝! – VerySadGuy

+0

然後標記爲正確的答案夥計;) –

+0

哦對不起!我不知道我必須這樣做。對不起,遲到了! – VerySadGuy