Сохранение одного столбца таблицы базы данных в ArrayList

Я пишу программу, которая отслеживает движение метки RFID, когда она перемещается между цензорами RFID. Это имитирует перемещение кошелька между комнатами. Каждый цензор будет дверью в другую комнату.

У меня есть база данных SQLite, которая содержит имя карты, местоположение и имя тега, чтобы различать разные карты.

Мне нужен ArrayList, который сообщает мне, какие теги в настоящее время находятся в базе данных.

У меня есть метод DAO, который отображает все значения в базе данных и сохраняет их в ArrayList, как показано ниже:

SELECT * FROM Wallets;
[name: Henry, location: 0, tag: 5c00ce6df0, name: jim, location: 0, tag: wallet1]

Я пытаюсь написать еще один метод DAO, который просто будет отображать теги следующим образом:

SELECT Tag FROM Wallets;
[5c00ce6df0, wallet1]

После того, как я сохранил эти значения в ArrayList, я намереваюсь передать их другому методу DAO, который принимает теги и возвращает всю соответствующую информацию, например:

SELECT * FROM Wallets WHERE Tag = 'wallet1';
name: jim, location: 0, tag: wallet1

Вот код моего getAllWallets() DAO:

public ArrayList<Wallet> getAllWallets() throws SQLException{
    Connection dbConnection = null;
    Statement statement = null;
    ResultSet resultset = null;
    String query = "SELECT * FROM Wallets;";
    ArrayList<Wallet> list = new ArrayList<>(); 

    try {
        dbConnection = getDBConnection();
        statement = dbConnection.createStatement();
        System.out.println(query);
        // execute SQL query
        resultset = statement.executeQuery(query);

    while (resultset.next()) {
        Wallet w = new Wallet(query, 0, query);

        w.setName(resultset.getString("Name"));
        w.setLocation(resultset.getInt("Location"));
        w.setTag(resultset.getString("Tag"));
        list.add(w);
        }   
    } 

    catch (SQLException e) {
        System.out.println(e.getMessage());
    } 
    finally 
    {
        resultset.close();
        statement.close();
        dbConnection.close();
        }   
    return list;
    }

Вот что я пробовал для своего getWalletTag() DAO:

public ArrayList<String> getWalletTag() throws SQLException {
    Connection dbConnection = null;
    ResultSet resultset = null;
    Statement statement = null;
    ArrayList<String> list = new ArrayList<String>(); 
    String query = "SELECT Tag FROM Wallets;";

    try {
        dbConnection = getDBConnection();
        statement = dbConnection.createStatement();
        // execute SQL query
        System.out.println(query);
        resultset = statement.executeQuery(query);

        String tag = tag.toString(); // i know this is totally wrong but i got stuck

        list.add(tag);

    }
    catch (SQLException e) {
        System.out.println(e.getMessage());
    }

    finally 
    {
        if (resultset != null) {
        resultset.close();
        }
        if (statement != null) {
        statement.close();
        }
        if (dbConnection != null) {
        dbConnection.close();
        }
    }
    return list;
}

Я борюсь с тем, как получить все значения столбца тегов в список массивов. Есть простой способ сделать это? Любая помощь будет оценена. Спасибо.

Где исходный код Java? что ты уже испробовал?

Dustin Nieffenegger 08.02.2019 20:30

Если это будет приложение с большим объемом данных, я мог бы предложить использовать ORM. Он позволяет вам получать доступ к информации базы данных через Java и загружать ее в объекты, которые были созданы для вас на основе схемы базы данных. Я использовал несколько за эти годы на разных языках. В Java я успешно использую jOOQ. jooq.org

Evan 08.02.2019 20:32

@DustinNieffenegger Я отредактировал его, чтобы показать исходный код.

henry434 08.02.2019 20:36

@ Эван, да, это звучит хорошо, не могли бы вы указать мне правильное направление, чтобы я мог разобраться в этом?

henry434 08.02.2019 20:37

@StaticBeagle, я не уверен, что вы имеете в виду, в настоящее время тег является первичным ключом в моей базе данных.

henry434 08.02.2019 20:42

Ссылка в конце моего первого комментария приведет вас на www.jooq.org. Это веб-сайт для jOOQ, Java ORM, с которым я добился хорошего успеха.

Evan 08.02.2019 21:07
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
6
1 137
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В «идеальной вселенной» вы, вероятно, захотите использовать ОРМ (например, Hibernate) и фреймворк (например, Весенний ботинок).

Любой из них или оба могут быть «излишними» для вашего приложения.

Если ваша цель — получить «список тегов», то код, который у вас есть, выглядит нормально:

  • Подключиться к базе данных.
  • Сделайте запрос.
  • Скопируйте набор результатов в список объектов Java по одному.
  • Закройте соединение с БД, когда закончите.

Если ваша цель состоит в том, чтобы «оптимально» найти тег конкретный (без выполнения другого запроса к БД), то, возможно, вам следует использовать Java карта или Набор вместо ArrayList.

Если вы хотите рассмотреть Spring Boot и Sqlite, вот несколько руководств:

Эта часть вашего кода кажется хорошей:

public ArrayList<Wallet> getAllWallets() throws SQLException{
   resultset = statement.executeQuery(query);
   while (resultset.next()) {
     Wallet w = new Wallet(query, 0, query);
     w.setName(resultset.getString("Name"));
     w.setLocation(resultset.getInt("Location"));
     w.setTag(resultset.getString("Tag"));
     list.add(w);
   }   
   ...

Итак, один из двух вариантов:

  1. Либо забывать о getWalletTag(), и просто используйте свои кошельки для определения тегов, либо

  2. Используйте тот же запрос, просто сохраните столбец «тег» в списке массивов (вместо всего остального).

Вариант 2:

 public ArrayList<String> getWalletTag() throws SQLException {
   String query = "SELECT Tag FROM Wallets;";
   ...
   resultset = statement.executeQuery(query);
   List<String> tags = new ArrayList<String>();
   while (resultset.next()) {
     tags.add(resultset.getString("Tag"));
     ...

... или ...

     ...
   Set<String> tags = new HashSet<String>();
   while (resultset.next()) {
     tags.add(resultset.getString("Tag"));

Да! Вот и все, у меня сработал вариант 2! большое спасибо. это для курсовой работы в университете, поэтому, если у меня будет время в конце, я посмотрю на оптимизацию с помощью карты или набора, однако на данный момент этого достаточно, ха-ха. Еще раз большое спасибо.

henry434 08.02.2019 21:42

Другие вопросы по теме