如何搜索所有列和更新特定值SQLite
问题描述:
我有一个包含44列和700行的SQLite数据库。我使用Java创建了一个用户界面(我有两个textField和一个Button),以在第一个textField中搜索具有特定值的所有列,并使用第二个textField中的另一个值更新它。如何搜索所有列和更新特定值SQLite
问题是我不知道哪个列在第一个textField中输入了值,这就是为什么我不能直接使用"Update table_name SET column_name ..."
声明。
我试过的是;
"Select * FROM table_name WHERE '%" + TextField.getText() + "%';
但它没有奏效。 你能帮我建立正确的查询吗?
答
您可以查看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());
您必须分别在每列中进行搜索。或者使用[FTS](http://www.sqlite.org/fts3.html)。 –
@CL。是不是可以使用嵌套查询来完成。内部查询附加每行的所有列(使用'||'),外部查询使用通配符对附加数据进行检查。 – piechuckerr