Я пишу программу, которая отслеживает движение метки 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;
}
Я борюсь с тем, как получить все значения столбца тегов в список массивов. Есть простой способ сделать это? Любая помощь будет оценена. Спасибо.
Если это будет приложение с большим объемом данных, я мог бы предложить использовать ORM. Он позволяет вам получать доступ к информации базы данных через Java и загружать ее в объекты, которые были созданы для вас на основе схемы базы данных. Я использовал несколько за эти годы на разных языках. В Java я успешно использую jOOQ. jooq.org
@DustinNieffenegger Я отредактировал его, чтобы показать исходный код.
@ Эван, да, это звучит хорошо, не могли бы вы указать мне правильное направление, чтобы я мог разобраться в этом?
@StaticBeagle, я не уверен, что вы имеете в виду, в настоящее время тег является первичным ключом в моей базе данных.
Ссылка в конце моего первого комментария приведет вас на www.jooq.org. Это веб-сайт для jOOQ, Java ORM, с которым я добился хорошего успеха.




В «идеальной вселенной» вы, вероятно, захотите использовать ОРМ (например, Hibernate) и фреймворк (например, Весенний ботинок).
Любой из них или оба могут быть «излишними» для вашего приложения.
Если ваша цель — получить «список тегов», то код, который у вас есть, выглядит нормально:
Если ваша цель состоит в том, чтобы «оптимально» найти тег конкретный (без выполнения другого запроса к БД), то, возможно, вам следует использовать 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);
}
...
Итак, один из двух вариантов:
Либо забывать о getWalletTag(), и просто используйте свои кошельки для определения тегов, либо
Используйте тот же запрос, просто сохраните столбец «тег» в списке массивов (вместо всего остального).
Вариант 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! большое спасибо. это для курсовой работы в университете, поэтому, если у меня будет время в конце, я посмотрю на оптимизацию с помощью карты или набора, однако на данный момент этого достаточно, ха-ха. Еще раз большое спасибо.
Где исходный код Java? что ты уже испробовал?