2013-08-06 60 views
0

我編輯的問題: 我想存儲數據庫的所有表的外鍵在一個數組列表Fkeys。我有現有表的檢索外鍵(如果存在)的方法getFK將元素存儲到ArrayList中,但會導致冗餘?

public ArrayList Fkeys = new ArrayList(); 
public ArrayList Vec = new ArrayList(); 

public ArrayList getFK() { 
    try { 

     /* Database connection */ 

     DBConnection connect = new DBConnection(); 
     connect.DBConnect(); 
     Connection con = connect.con; 
     /* Getting some infos regarding keys*/ 
     DatabaseMetaData metadata = con.getMetaData(); 
     ResultSet clefs = metadata.getImportedKeys(null, null, "persons"); 

while(clefs.next()) { 
    Vec.add(clefs.getString("FKCOLUMN_NAME")); 
        } 
    Fkeys.add(Vec); 


    clefs = metadata.getImportedKeys(null, null, "departments"); 

while(clefs.next()) { 
    Vec.add(clefs.getString("FKCOLUMN_NAME")); 
        } 
    Fkeys.add(Vec); 
} 

現在,當我執行此我得到這樣的結果:[],[],因爲這兩個表的人員和部門都沒有外鍵。 但是,當我將這些行添加到該方法對於其中有3個外鍵

​​

我得到這個結果表學生: [ID,人,德普],[ID,人,德普],[ id,person,depp]] 雖然它應該是: [[id,person,depp],[],[]] 我在做什麼錯?爲什麼Vec的內容存儲在Fkeys的所有位置?

+0

譜號聲明在哪裏,它在哪裏填充? –

+1

這很明顯,這不是真正的代碼,嚴重懷疑它足夠緊密地匹配真正的代碼以進行適當的分析。請提供一個真正的SSCCE。 –

+0

您好像每次調用'getFK'時都會返回同樣的'ArrayList'實例(它在方法外聲明爲常規類成員)。使數組列表成爲'getFK'的適當局部變量。 – Dirk

回答

1

這個循環似乎增加每次alist同樣的事情...

while(keys.next()) { 
      alist.add(clefs.getString("FKCOLUMN_NAME")); 
    } 

我不能肯定這是這個問題(「因爲你不告訴我們什麼clefs是!)...但它看起來強烈懷疑我。

+0

對不起,clefs是結果集鍵 – dzwowt

+0

當我顯示alist表的內容與沒有外鍵的表時它給了我一個空的數組結果,所以它可能正常工作我真的coudln't找到問題的地方 – dzwowt

+0

所以你這是說,這不是你展示給我們的實際代碼。我不認爲嘗試診斷不是真正的代碼的代碼是非常重要的。請提供適當的SSCCE。 –

0

退房Sets,他們就像列表,但他們有能力在對象內部是唯一的。即如果您有:

Set<Integer> intSet = new HashSet<Integer>() 
intSet.add(1); 
intSet.add(1); 
for (Integer i : intSet) { 
    System.out.println(i); 
} 

最終的輸出應該是:

1 

集不允許在同一組的多個相同的對象。另外,當你聲明你的ArrayLists時,一定要記下每一個ArrayList的類型,否則你的IDE應該對你大喊大叫,但我認爲它默認爲Object。如果您需要設置/列表中的3個字段並聲明它爲List<CustomModelObject> listOfObjects = new ArrayList<CustomModelObject>();(請參閱上面的示例,如果您需要Set的示例),我建議使用自定義模型對象

相關問題