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

时间:2017-04-04 15:18:35

标签: java database sqlite

我有一个包含44列和700行的SQLite数据库。我创建了一个带有Java的用户界面(我有两个textFields和一个Button)来搜索第一个textField中具有特定值的所有列,并使用第二个textField中的另一个值更新它。

问题是我不知道哪个列在第一个textField中输入了值,这就是为什么我不能直接使用"Update table_name SET column_name ..."语句。

我尝试的是什么;

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

但它没有用。 你能帮我建立正确的查询吗?

1 个答案:

答案 0 :(得分: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);

要更新与select查询匹配的行中的值,您必须遍历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());