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();
    
            }
}
}
Moorhuhn:

从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的使用,可以在线查看一些教程

现在,在编写正确的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部分,但是细节由您决定。

如前所述,如果您需要更具体的陈述或需要一些变体,请查看您喜欢教程(提供的只是一个示例,请随意使用。)

另一个要注意的是:我建议不要使用.complete()而是使用.queue()如果您想知道原因和方式,请查看此页面。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章