不和谐 Java JDA |从 SQLite 删除数据/从 SQLite 获取数据 [关闭]
Posted
技术标签:
【中文标题】不和谐 Java JDA |从 SQLite 删除数据/从 SQLite 获取数据 [关闭]【英文标题】:Discord Java JDA | deleting data from SQLite / getting data from SQLite [closed] 【发布时间】:2020-12-17 19:09:21 【问题描述】:我正在尝试制作基于票证的支持系统,我想知道如何从 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();
【问题讨论】:
还有……有什么问题? 【参考方案1】:从 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.
【讨论】:
以上是关于不和谐 Java JDA |从 SQLite 删除数据/从 SQLite 获取数据 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Discord Bot 不会删除消息(带有 JDA API 的 Eclipse IDE Java)