Java 如何搜索所有列并更新特定值SQLite
我有一个SQLite数据库,有44列700行。我用Java创建了一个用户界面(我有两个textField和一个按钮),用于搜索第一个textField中具有特定值的所有列,并在第二个textField中使用另一个值更新它 问题是我不知道在第一个文本字段中哪个列有输入的值,这就是为什么我不能直接使用Java 如何搜索所有列并更新特定值SQLite,java,database,sqlite,Java,Database,Sqlite,我有一个SQLite数据库,有44列700行。我用Java创建了一个用户界面(我有两个textField和一个按钮),用于搜索第一个textField中具有特定值的所有列,并在第二个textField中使用另一个值更新它 问题是我不知道在第一个文本字段中哪个列有输入的值,这就是为什么我不能直接使用“updatetable\u name SET column\u name…”语句的原因 我尝试的是 "Select * FROM table_name WHERE '%" + TextField.ge
“updatetable\u name SET column\u name…”
语句的原因
我尝试的是
"Select * FROM table_name WHERE '%" + TextField.getText() + "%';
但它不起作用。
你能帮我建立正确的查询吗?你可以像CL提到的那样查看FTS表,但另一种方法是创建一种更简单的方法来查询每一列。您可以创建一个函数来循环遍历每一列以生成其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);
您必须分别在每列中搜索。或者使用。@CL.is不是。它可以使用嵌套查询来完成。内部查询附加每行的所有列(使用
| |
),外部查询在附加数据上使用通配符检查文本。Select query非常有效,谢谢。你能帮助建立更新语句吗?当我将您的查询发送到数据库时,它会给出一个完整的行,我想用textField2.getText()值更新该特定值。非常感谢您的帮助我编辑了我的答案,以包括更新从结果集中找到的任何匹配项。感谢您编辑您的答案,它适用于前10列(当我输入它找到并更新的前10列的值时),但在11列之后。列(当它在前10列中找不到时)给了我NullPointerException。怎么可能呢?我试过“rs.setFetchSize(100);”但它也不起作用。你能帮助我吗?多谢各位。
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());