2017-04-04 36 views
0

我有一個包含44列和700行的SQLite數據庫。我使用Java創建了一個用戶界面(我有兩個textField和一個Button),以在第一個textField中搜索具有特定值的所有列,並使用第二個textField中的另一個值更新它。如何搜索所有列和更新特定值SQLite

問題是我不知道哪個列在第一個textField中輸入了值,這就是爲什麼我不能直接使用"Update table_name SET column_name ..."聲明。

我試過的是;

"Select * FROM table_name WHERE '%" + TextField.getText() + "%'; 

但它沒有奏效。 你能幫我建立正確的查詢嗎?

+0

您必須分別在每列中進行搜索。或者使用[FTS](http://www.sqlite.org/fts3.html)。 –

+0

@CL。是不是可以使用嵌套查詢來完成。內部查詢附加每行的所有列(使用'||'),外部查詢使用通配符對附加數據進行檢查。 – piechuckerr

回答

0

您可以查看FTS表格作爲CL提到的,但另一種方法是創建一個更簡單的方法來查詢每一列。你可以創建一個函數循環遍歷每一列來創建where子句並使用OR將它們連接在一起。一種自動執行此操作並保存寫入所有44個列名的方法是查詢數據庫中的所有列名稱,並稍後將其用於查詢。

public String columnsLike(String like, String... cols) { 
    return columnsLike(like, Arrays.asList(cols)); 
} 

public String columnsLike(String like, List<String> cols) { 
    List<String> where = new ArrayList<>(); 
    for(String column : cols) { 
     where.add(column+" LIKE '"+like+"'"); 
    } 
    return where.stream().collect(Collectors.joining(" OR ")); 
} 

public List<String> getColumns(String table) { 
    ResultSet rs = statement.executeQuery("SELECT * FROM "+table); 
    ResultSetMetaData rsmd = rs.getMetaData(); 
    List<String> columns = new ArrayList<String>(); 
    for (int i = 1; i < rsmd.getColumnCount(); ++i) { columns.add(rsmd.getColumnName(i)); } 
    return columns; 
} 

String query = "SELECT * FROM table_name WHERE "+columnsLike('%'+textField.getText()+'%', "column1", "column2", "column3", "column4", "column5"); 
// Result: 
// SELECT * FROM table_name WHERE column1 LIKE '%hello%' OR column2 LIKE '%hello%' OR column3 LIKE '%hello%' OR column4 LIKE '%hello%' OR column5 LIKE '%hello%' 

// However you could save time from writing out every column and load them once into an array. 
List<String> columns = getColumns("table_name"); 
// Then call columnsLike('%'+textField.getText()+'%', columns); 

着手匹配,你將不得不通過ResultSet行,以更新特定的列再次檢查他們的選擇查詢的行中更新值。但是,由於我不知道所有列是否都是字符串,因此我使用getObject()而不是getString(),但如果所有列都是字符串,則可以更改該列。而且,在不知道數據的情況下,多列可以匹配,所以這將更新儘可能多的匹配。

public void updateColumns(String tableName, List<String> cols, ResultSet rs, String like, String newValue) { 
    PreparedStatement ps = conn.prepareStatement("UPDATE "+tableName+" SET "+column+" = ? WHERE "+column+" = ? "); 
    while(rs.next()) { 
     for(String column : cols) { 
      String value; 
      if((value = rs.getObject(column).toString()).matches(".*"+like+".*")) { 
       ps.setString(1, newValue); 
       ps.setString(2, value); 
       ps.addBatch(); 
      } 
     } 
    } 
    ps.executeBatch(); 
    ps.close(); 
    // rs.close(); 
} 

// updateColumns("table_name", columns, resultSet, textField.getText(), textField2.getText()); 
+0

選擇查詢工作就像一個魔術,謝謝。你能幫助建立更新聲明嗎?當我發送你的查詢數據庫它會給我像整行,我想用textField2.getText()值更新該特定值。非常感謝您幫助 – cbaser

+0

我編輯了我的答案,包括更新從ResultSet中找到的任何匹配項。 –

+0

感謝您編輯您的答案,它在前10列(當我從前10列找到並更新時輸入一個值)時,但在11.列後面(當它在前10列找不到時)給了我NullPointerException 。它怎麼可能?我試過「rs.setFetchSize(100);」但它不起作用。你可以幫我嗎 ?非常非常感謝你。 – cbaser

相關問題