不和谐 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 获取数据 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

不和谐 Java JDA |哪个反应是addet

Discord Bot 不会删除消息(带有 JDA API 的 Eclipse IDE Java)

关于我通过 jda 编码的不和谐机器人的问题

AFK 命令不和谐 (JDA)

不和谐 jda 机器人 || UserUpdateActivityEvent 不触发

发送后 10 秒使用 JDA 删除消息