JAVA / SqLite内存的行为不符合预期,行丢失

沃尔夫

我有以下使用sqlite3和java的代码,它们运行无误:

    public class SqLiteDB {
    public static void main(final String[] args) {
        final SqLiteDB theDatabase = SqLiteDB.initSqLiteDB();
        theDatabase.addParametersRow("test", "beam process");
        theDatabase.addParametersRow("test", "beam process 1");
        theDatabase.addParametersRow("test", "beam process 2");
        theDatabase.addParametersRow("test1", "beam process 1");
        theDatabase.addParametersRow("test1", "beam process 2");
        theDatabase.addParametersRow("test2", "beam process");
        theDatabase.addParametersRow("test2", "beam process 1");
        theDatabase.addParametersRow("test3", "beam process");
        theDatabase.addGroupStatements();
        for (final Entry<String, String> result : theDatabase.getParametersAll().entrySet()) {
            System.out.print(result.getKey() + ", " + result.getValue() + "\n");
        }
    }

    private static final Logger LOGGER = LoggerFactory.getLogger(SqLiteDB.class);

    private Connection dbConnection = null;
    private static SqLiteDB myInstance = null;

    // *****************************************************************************************************************
    // Public methods
    // *****************************************************************************************************************
    public static SqLiteDB initSqLiteDB() {
        if (myInstance == null) {
            myInstance = new SqLiteDB();
        }

        return myInstance;
    }

    public void addParametersRow(final String parameterName, final String beamProcessName) {
        final String sqlInsert = "INSERT INTO PARAMETERS (PARAMETER_NAME, BEAM_PROCESS) VALUES ('" + parameterName
                + "', '" + beamProcessName + "');";
        try (Statement insertStatement = dbConnection.createStatement()) {
            insertStatement.execute(sqlInsert);
        } catch (final SQLException ex) {
            ErrorLogger.logError(ex.getStackTrace(), ex);
        }
    }

    public Map<String, String> getParametersAll() {
        final String sqlGetParameterCount = "SELECT * FROM PARAMETERS";
        final Map<String, String> queryResults = new TreeMap<>();
        try (Statement queryParameterCount = dbConnection.createStatement()) {
            final ResultSet resultSet = queryParameterCount.executeQuery(sqlGetParameterCount);
            getClass();
            while (resultSet.next()) {
                queryResults.put(resultSet.getString(1), resultSet.getString(2));
            }
            resultSet.close();
        } catch (final SQLException ex) {
            ErrorLogger.logError(ex.getStackTrace(), ex);
        }

        return queryResults;
    }

    // *****************************************************************************************************************
    // Private methods
    // *****************************************************************************************************************
    private SqLiteDB() {
        try {
            dbConnection = DriverManager.getConnection("jdbc:sqlite::memory:");
        } catch (final SQLException ex) {
            ErrorLogger.logError(ex.getStackTrace(), ex);
        }

        createTableAvailableParameters();
    }

    private void createTableAvailableParameters() {
        if (dbConnection != null) {
            final String sqlCreateTable = "CREATE TABLE IF NOT EXISTS PARAMETERS (\n"
                    + " PARAMETER_NAME text NOT NULL, BEAM_PROCESS text NOT NULL, PRIMARY KEY (PARAMETER_NAME, BEAM_PROCESS));";
            try (final Statement statement = dbConnection.createStatement()) {
                statement.execute(sqlCreateTable);
            } catch (final SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }

    private void addGroupStatements() {
        final String sqlGetParameterCount = "SELECT PARAMETER_NAME, COUNT(PARAMETER_NAME) FROM PARAMETERS GROUP BY PARAMETER_NAME HAVING COUNT(PARAMETER_NAME) > 1";
        final Map<String, Integer> queryResults = new HashMap<>();
        try (Statement queryParameterCount = dbConnection.createStatement()) {
            final ResultSet resultSet = queryParameterCount.executeQuery(sqlGetParameterCount);
            getClass();
            while (resultSet.next()) {
                queryResults.put(resultSet.getString(1), resultSet.getInt(2));
            }
            resultSet.close();
        } catch (final SQLException ex) {
            ErrorLogger.logError(ex.getStackTrace(), ex);
        }

        for (final Entry<String, Integer> resultRow : queryResults.entrySet()) {
            if (resultRow.getValue() > 1) {
                addParametersRow(resultRow.getKey(), "*");
            }
        }
    }
}

当我运行代码时,它将产生以下输出:

test, *
test1, *
test2, *
test3, beam process

我不知道我的“ test(1,2),beam process(1,2)”行在哪里?他们为什么/在哪里迷路?

Stackoverflow不接受带有大量代码的发布。我不知道如何截断代码而不忽略可能需要的细节。这就是为什么我不得不添加一些更无用的文本的原因。我希望这可以使这个问题可以发表。

伊利达

损失发生在函数中getParametersAll()在此功能中,您遍历可用结果并将其添加到地图中。但是,如果出现重复的值,则将覆盖映射中已读取的结果。因此,您仅会为每个参数获得最后创建的光束过程。

解决此问题的一种方法是创建一个Map<String, List<String>>地图,然后返回此地图。

Map<String, List<String>> queryResults = new TreeMap<>();
while (resultSet.next()) {
    if (!queryResults.contains(resultSet.getString(1)) {
        queryResults.put(resultSet.getString(1), new ArrayList<>());
    }
    queryResults.get(resultSet.getString(1)).add(resultSet.getString(2));
}

希望这能回答您的问题,否则我可能误解了您的问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章