不和谐 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.