如何解决Discord Java JDA |从SQLite删除数据/从SQLite获取数据
我正在尝试建立一个基于票证的支持系统,我想知道如何从SQLite表中读取和删除数据。
系统将像这样运行:
您单击一个反应,然后漫游器会检查您是否已经拥有一个专用通道,否则,它将创建一个专用通道。
如果您通过单击个人频道中的反应关闭票证,则该频道和您的数据将被删除。
到目前为止,这是我的代码:
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
获取的列的名称。很不言自明。
如果要选择多个列,只需用逗号列出它们,如下所示:
SELECT column1,column2,column3 FROM table WHERE condition;
要选择表中的每一列,只需编写*
而不是各列。
SELECT * FROM table WHERE condition;
注意:如果您在语句中选择了ResultSet
中的列,则只能访问它们。如果选择channelid
,将无法获得userid
,除非您也选择了它。 (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;
如第一部分所述,您必须选择要从中删除数据的表,然后使用条件缩小范围。
对于您来说,删除特定票证将是这样的:
DELETE FROM ticketchans WHERE guildid = GID and userid = UID and channelid = CID;
如果您在这种情况下不使用全部三个ID,则最终可能会删除公会或用户的所有票证。由于channelid始终是唯一的,因此您可以跳过userid = UID
部分,但是细节由您决定。
如前所述,如果您需要更具体的陈述或需要一些变体,请查看您喜欢的tutorial。 (提供的只是一个示例,请随意使用。)
另一方面,我建议不要使用.complete()
,而应该使用.queue()
。
如果您想知道原因和方式,请check out this page.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。