【问题标题】:Discord Java JDA | deleting data from SQLite / getting data from SQLite [closed]不和谐 Java JDA |从 SQLite 删除数据/从 SQLite 获取数据 [关闭]
【发布时间】: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();
    
            }
}
}

【问题讨论】:

  • 还有……有什么问题?

标签: java sqlite maven discord discord-jda


【解决方案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.

【讨论】:

    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多