我正在尝试建立一个基于票证的支持系统,我想知道如何从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的使用,可以在线查看一些教程。
现在,在编写正确的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] 删除。
我来说两句