Данные, которые я вставил в таблицу, не заменяют старые данные, есть ли способ заменить данные, если они уже есть? - PullRequest
0 голосов
/ 06 мая 2020

Проблема заключается в следующем: я сохраняю хешированный пароль для школьного проекта, однако я застрял на синтаксисе оператора SQL, чтобы заменить данные, если они уже есть. В таблице нужно будет хранить только одну комбинацию имени пользователя и пароля.

public class DatabaseManager {

    String dbPath = "jdbc:sqlite:test.db";

    public DatabaseManager () {
        try {
            Class.forName("org.sqlite.JDBC");
            Connection conn = DriverManager.getConnection(dbPath);
            if (conn != null) {
                System.out.println("Connected to the database");
                DatabaseMetaData dm = (DatabaseMetaData) conn.getMetaData();

                // Setting up database
                databaseSetup(conn);

                boolean tempInsertion = databaseInsert("pancake", "house", conn);

                // Inserting data
                if (tempInsertion) {
                    System.out.println("Data insertion failed");
                }

                // Retrieving data

                List<String> retrievedData = databaseSelect(conn);

                if (retrievedData == null) {
                    System.out.println("Data extraction failed");
                }
                else {
                    System.out.println(retrievedData.size());
                }
                conn.close();
            }
        }
        catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }

    private boolean databaseInsert(String username, String password, Connection conn) {

        String sqlInsert = "INSERT OR REPLACE INTO login(username, password) VALUES(?,?)";

        PreparedStatement prepStatement;
        try {
            prepStatement = conn.prepareStatement(sqlInsert);
            prepStatement.setString(1, encrypt(username));
            prepStatement.setString(2, encrypt(password));

            prepStatement.executeUpdate();
        } catch (SQLException e) {
            return false;
        }      
        return true;
    }

    private List<String> databaseSelect(Connection conn) {
        List<String> tempList = new ArrayList<String>();

        String sqlSelect = "SELECT * FROM login";  

        Statement stmt;
        try {
            stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(sqlSelect);  

            tempList.add(rs.getString("username"));
            tempList.add(rs.getString("password"));

            int columnsNumber = rs.getMetaData().getColumnCount();

            while (rs.next()) {
                for (int i = 1; i <= columnsNumber; i++) {
                    if (i > 1) System.out.print(",  ");
                    String columnValue = rs.getString(i);
                    System.out.print(columnValue + " " + rs.getMetaData().getColumnName(i));
                }
                System.out.println("");
            }

        } catch (SQLException e) {
            return null;
        }  
        return tempList;
    }

    private void databaseSetup( Connection conn) {
        String sqlExpression = "CREATE TABLE login (username varchar(255), password varchar(255))";

        try {
            Statement statement = conn.createStatement();
            statement.execute(sqlExpression);
        } catch (SQLException e) {}
    }   

    private String encrypt(String string) {
        try {
            MessageDigest exampleCrypt = MessageDigest.getInstance("SHA1");
            exampleCrypt.reset();

            exampleCrypt.update(string.getBytes("UTF-8"));
            return convertByte(exampleCrypt.digest());

        }
        catch(NoSuchAlgorithmException e) {
            System.out.println("Error, cannot encrypt string");
            e.printStackTrace();
        }
        catch(UnsupportedEncodingException e) {
            System.out.println("Error, cannot encrypt string");
            e.printStackTrace();
        }
        return null;
    }

    private static String convertByte(final byte[] hash) {

        Formatter formatter1 = new Formatter();

        for (byte i : hash) {
            formatter1.format("%02x", i);
        }
        String encryptedData = formatter1.toString();

        formatter1.close();
        return encryptedData;

    }

}

Проблема, как указано, заключается в том, что я хотел бы хранить только одну комбинацию пароля / имени пользователя за раз, как ha sh. Однако, когда это происходит, он дублирует комбинацию ha sh, а не заменяет ее.

...