首页 > 解决方案 > 将数据库表的一列存储到 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;
}

我正在努力解决的是如何将 Tag 列的所有值放入数组列表中。是否有捷径可寻?任何帮助将不胜感激。谢谢。

标签: java

解决方案


在“理想世界”中,您可能想要使用ORM(如 Hibernate)和框架(如Spring Boot)。

对于您的应用程序来说,其中一个或两个都可能是“矫枉过正”。

如果您的目标是获得“标签列表”,那么您获得的代码看起来不错:

  • 连接到数据库。
  • 进行查询。
  • 将结果集复制到 Java 对象列表中,一次一个。
  • 完成后关闭数据库连接。

如果您的目标是“以最佳方式”找到特定标记(无需进行另一个 DB 查询),那么也许您应该使用 Java MapSet而不是 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"));

推荐阅读