Я создаю приложение на Java для извлечения данных из базы данных MySQL. После выполнения запроса я получаю ResultSet и делаю следующее для извлечения записей:
while (rs.next())
{
for (int column = 1; column <= rm.getColumnCount(); column++) {
row.add(rs.getObject(column));
}
result.add(row.toString());
row.clear();
}
где RS = ResultSet и rm = ResultSetMetaData
Проблема в том, что мне нужно использовать result.add (row.toString ());, а не просто result.add (строка); (с помощью которого я хотел бы создать двумерный ArrayList). В противном случае я получаю пустые результаты.
Я попытался поставить row.clear (); в начале перед циклом для, но в результате все мои результаты были заполнены несколькими экземплярами последней записи. Точно так же, как строка не добавлялся в результат до самого конца, когда он равен последней записи. Нужно ли мне «фиксировать» ArrayList строка перед добавлением его в качестве элемента в другой ArrayList? Если да, то как? Кроме того, из любопытства, почему .нанизывать() работает иначе?




Добавляя row.toString (), вы создаете новый объект String для добавления в результат.
С другой стороны, добавляя row, вы добавляете тот же объект в результат, поэтому каждый раз, когда вызывается row.clear (), он очищает все строки в результате.
Что вам следует сделать, так это создать новый объект строки перед циклом for и не выполнять row.clear (). Ниже приводится пример.
while (rs.next())
{
row = new ArrayList();
for (int column = 1; column <= rm.getColumnCount(); column++) {
row.add(rs.getObject(column));
}
result.add(row);
}
Итак, в основном result.add (row) работает как «передача по ссылке», не копируя объект, а просто предоставляя ссылку на него? Спасибо, что решила мою проблему :)