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.