如何搜索所有列和更新特定值SQLite

问题描述:

我有一个包含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

您可以查看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