不和谐 Java JDA |从 SQLite 中删除数据/从 SQLite 中获取数据
Discord Java JDA | deleting data from SQLite / getting data from SQLite
我正在尝试制作一个基于票证的支持系统,我想知道如何从 SQLite 中读取和删除数据 table。
系统将像这样工作:
你点击一个反应,机器人会检查你是否已经有一个专用频道,如果没有,它会创建一个。
如果您通过点击个人频道中的反应关闭票证,该频道和您的数据将被删除。
到目前为止,这是我的代码:
public void onMessageReactionAdd(MessageReactionAddEvent event) {
if(!event.getUser().isBot()) {
if(event.getChannel().getIdLong() == 747412032281772033l && event.getReactionEmote().getEmoji().equals("\uD83C\uDFAB")) {
ResultSet set = LiteSQL.onQuery("SELECT channelid FROM ticketchans WHERE guildid = " + event.getGuild().getIdLong() + " AND userid = " + event.getUserIdLong());
try {
Long user = set.getLong("userid");
if(!(user == event.getUserIdLong())){
Category cat = ((GuildChannel) event.getChannel()).getParent();
TextChannel chan = cat.createTextChannel(event.getMember().getEffectiveName() + "'s TicketChannel").complete();
EmbedBuilder builder = new EmbedBuilder();
builder.setDescription("Hi " + event.getMember().getAsMention() + ", bitte beschreibe hier detailiert dein Anliegen. Wenn du dein ticket schliessen willst klicke auf das X");
builder.setColor(Color.decode("#910cc9"));
chan.sendMessage(builder.build()).queue(Message -> {
Message.addReaction("\u274C").queue();
});
set.next();
LiteSQL.onUpdate("INSERT INTO ticketchans(guildid, channelid, userid) VALUES(" +
event.getGuild().getIdLong() + ", " + event.getChannel().getIdLong() + ", " + event.getUserIdLong() + ")");
event.getChannel().sendMessage(event.getUser().getAsMention() + " TicketChannel eröffnet!").complete().delete().queueAfter(4, TimeUnit.SECONDS);
}
}catch (SQLException e) {}
}
if(event.getReactionEmote().getEmoji().equals("\u274C")) {
//delete data in table event.getGuild().getGuildChannelById(event.getChannel().getIdLong()).delete().reason("").queue();
}
}
}
从 SQLite
获取数据
其中大部分一般适用于 SQL,并不特定于 SQLite。
首先,SELECT
语句由不同的部分组成。
SELECT columns FROM table WHERE condition;
对于 columns
,您必须填写要从 table
中获取的列的名称。漂亮self-explanatory。
如果你想 select 超过一列,你只需要用逗号列出它们,就像这样:
SELECT column1, column2, column3 FROM table WHERE condition;
为了 select 你 table 的每一列,你只需写 *
而不是列。
SELECT * FROM table WHERE condition;
注意:如果您在语句中 select 编辑了 ResultSet
中的列,则只能访问这些列。如果你 select channelid
你将无法获得 userid
,除非你也 select 它。 (SELECT channelid, userid FROM table WHERE condition;
)
您似乎理解 WHERE
部分,所以我将跳过它。如果您需要更多帮助或想进一步扩展 SQLite 的使用范围,您可以在线查看一些 tutorials。
现在,在编写了正确的 SELECT
语句后,是时候访问 Java 中的数据了。
因此,您必须遍历 ResultSet
。
ResultSet rs = LiteSQL.onQuery(
"SELECT channelid, userid
FROM ticketchans
WHERE guildid = " + event.getGuild().getIdLong() + "
AND userid = " + event.getUserIdLong()
);
// loop through the result set
while (rs.next()) {
Long userid = rs.getLong("userid");
Long channelid = rs.getLong("channelid");
}
您现在拥有了所需的数据,可以随心所欲地使用它。
正在从 SQLite
中删除数据
其中大部分一般适用于 SQL,并不特定于 SQLite。
DELETE
语句与 SELECT
语句具有相似的结构,尽管它缺少列(当然)。
DELETE FROM table WHERE condition;
如第一部分所述,您必须选择要从中删除数据的 table,然后使用条件缩小范围。
在您的情况下,删除特定的工单应该是这样的:
DELETE FROM ticketchans WHERE guildid = GID and userid = UID and channelid = CID;
如果您没有在条件中使用所有三个 ID,您最终可能会删除公会或用户的所有门票。由于 channelid 始终是唯一的,您可以跳过 userid = UID
部分,但细节由您决定。
如前所述,如果您需要更具体的陈述或需要一些变体,请查看您喜欢的 tutorial。 (提供的只是一个例子,使用任何你喜欢的table。)
另外一点:我建议不要使用 .complete()
,而应使用 .queue()
。
如果你想知道为什么以及如何,check out this page.
我正在尝试制作一个基于票证的支持系统,我想知道如何从 SQLite 中读取和删除数据 table。
系统将像这样工作:
你点击一个反应,机器人会检查你是否已经有一个专用频道,如果没有,它会创建一个。
如果您通过点击个人频道中的反应关闭票证,该频道和您的数据将被删除。
到目前为止,这是我的代码:
public void onMessageReactionAdd(MessageReactionAddEvent event) {
if(!event.getUser().isBot()) {
if(event.getChannel().getIdLong() == 747412032281772033l && event.getReactionEmote().getEmoji().equals("\uD83C\uDFAB")) {
ResultSet set = LiteSQL.onQuery("SELECT channelid FROM ticketchans WHERE guildid = " + event.getGuild().getIdLong() + " AND userid = " + event.getUserIdLong());
try {
Long user = set.getLong("userid");
if(!(user == event.getUserIdLong())){
Category cat = ((GuildChannel) event.getChannel()).getParent();
TextChannel chan = cat.createTextChannel(event.getMember().getEffectiveName() + "'s TicketChannel").complete();
EmbedBuilder builder = new EmbedBuilder();
builder.setDescription("Hi " + event.getMember().getAsMention() + ", bitte beschreibe hier detailiert dein Anliegen. Wenn du dein ticket schliessen willst klicke auf das X");
builder.setColor(Color.decode("#910cc9"));
chan.sendMessage(builder.build()).queue(Message -> {
Message.addReaction("\u274C").queue();
});
set.next();
LiteSQL.onUpdate("INSERT INTO ticketchans(guildid, channelid, userid) VALUES(" +
event.getGuild().getIdLong() + ", " + event.getChannel().getIdLong() + ", " + event.getUserIdLong() + ")");
event.getChannel().sendMessage(event.getUser().getAsMention() + " TicketChannel eröffnet!").complete().delete().queueAfter(4, TimeUnit.SECONDS);
}
}catch (SQLException e) {}
}
if(event.getReactionEmote().getEmoji().equals("\u274C")) {
//delete data in table event.getGuild().getGuildChannelById(event.getChannel().getIdLong()).delete().reason("").queue();
}
}
}
从 SQLite
获取数据其中大部分一般适用于 SQL,并不特定于 SQLite。
首先,SELECT
语句由不同的部分组成。
SELECT columns FROM table WHERE condition;
对于 columns
,您必须填写要从 table
中获取的列的名称。漂亮self-explanatory。
如果你想 select 超过一列,你只需要用逗号列出它们,就像这样:
SELECT column1, column2, column3 FROM table WHERE condition;
为了 select 你 table 的每一列,你只需写 *
而不是列。
SELECT * FROM table WHERE condition;
注意:如果您在语句中 select 编辑了 ResultSet
中的列,则只能访问这些列。如果你 select channelid
你将无法获得 userid
,除非你也 select 它。 (SELECT channelid, userid FROM table WHERE condition;
)
您似乎理解 WHERE
部分,所以我将跳过它。如果您需要更多帮助或想进一步扩展 SQLite 的使用范围,您可以在线查看一些 tutorials。
现在,在编写了正确的 SELECT
语句后,是时候访问 Java 中的数据了。
因此,您必须遍历 ResultSet
。
ResultSet rs = LiteSQL.onQuery(
"SELECT channelid, userid
FROM ticketchans
WHERE guildid = " + event.getGuild().getIdLong() + "
AND userid = " + event.getUserIdLong()
);
// loop through the result set
while (rs.next()) {
Long userid = rs.getLong("userid");
Long channelid = rs.getLong("channelid");
}
您现在拥有了所需的数据,可以随心所欲地使用它。
正在从 SQLite
中删除数据其中大部分一般适用于 SQL,并不特定于 SQLite。
DELETE
语句与 SELECT
语句具有相似的结构,尽管它缺少列(当然)。
DELETE FROM table WHERE condition;
如第一部分所述,您必须选择要从中删除数据的 table,然后使用条件缩小范围。
在您的情况下,删除特定的工单应该是这样的:
DELETE FROM ticketchans WHERE guildid = GID and userid = UID and channelid = CID;
如果您没有在条件中使用所有三个 ID,您最终可能会删除公会或用户的所有门票。由于 channelid 始终是唯一的,您可以跳过 userid = UID
部分,但细节由您决定。
如前所述,如果您需要更具体的陈述或需要一些变体,请查看您喜欢的 tutorial。 (提供的只是一个例子,使用任何你喜欢的table。)
另外一点:我建议不要使用 .complete()
,而应使用 .queue()
。
如果你想知道为什么以及如何,check out this page.