我正在为我的Minecraft服务器编写bukkit插件,并且我的代码在Result set部分的类或方法的编写方式上存在错误,或者如我所假定的那样。
没有检测到我的播放器已经在SQL表中。这是在hasPlayer方法中。
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
Player p = event.getPlayer();
SQLCheckPlayer pCheck = new SQLCheckPlayer();
pCheck.p = p;
boolean i = pCheck.hasPlayer();
if (i == false) {
boolean n = pCheck.addPlayer();
if (n == true) {
p.sendMessage("You have been added to our database");
} else {
p.sendMessage("There was errors in trying to add you to our database");
}
} else {
p.sendMessage("You are in our database");
}
}
SQLCheckPlayer类
public class SQLCheckPlayer {
Player p;
public boolean hasPlayer() {
UUID pUUID = p.getUniqueId();
String query = "SELECT playerID FROM playerInfo;";
try {
if (sqlConnection.getDatabaseConnection() != null) {
Statement st = sqlConnection.getDatabaseConnection().createStatement();
ResultSet rs = st.executeQuery(query);
if (rs != null) {
do{
if(pUUID.toString() == rs.toString()) {
st.close();
Bukkit.broadcastMessage("Player successfully added");
return true;
}
} while(rs.next());
}
st.close();
} else {
Bukkit.broadcastMessage("Database connection is null");
return false;
}
return false;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Bukkit.broadcastMessage("Sql Exception");
return false;
}
}
public boolean addPlayer() {
UUID pUUID = p.getUniqueId();
try {
PreparedStatement st = sqlConnection.getDatabaseConnection().prepareStatement("INSERT INTO playerInfo (playerID, playerName, playerDiamonds) VALUES (?, ?, ?)");
st.setString(1, pUUID.toString());
st.setString(2, p.getDisplayName());
st.setInt(3, 0);
st.executeUpdate();
st.close();
return true;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
}
}
将我添加到数据库中后(它可以成功完成此操作),无论何时我加入,它都应该显示“您在我们的数据库中”,但始终显示为“尝试将您添加到我们的数据库时出错” 。在打印的堆栈跟踪上,它说代码正在尝试再次将我添加到数据库中,但由于我在playerUUID列上放置了一个唯一的选项卡,所以无法这样做。
答案 0 :(得分:0)
您正在告诉我们
DeleteStep1Data()
输出boolean i = pCheck.hasPlayer();
if (i == false) {
boolean n = pCheck.addPlayer();
if (n == true) {
p.sendMessage("You have been added to our database");
} else {
p.sendMessage("There was errors in trying to add you to our database");
}
} else {
p.sendMessage("You are in our database");
}
。
这是因为{p> "There was errors in trying to add you to our database"
将是pCheck.hasPlayer()
false
不考虑UUID pUUID = p.getUniqueId();
String query = "SELECT playerID FROM playerInfo;";
。相反,它将查找以pUUID
作为其"playerId"
的条目。结果是尝试再次插入此播放器,由于某些数据库约束(唯一的主键或类似的主键),该播放器无法正常工作。
您可能希望将查询改写为
UUID
,然后重试。 我希望这会有所帮助...
答案 1 :(得分:0)
问题出在您的SQLCheckPlayer#hasPlayer()
方法上,因为由于字符串比较它永远都不会返回true,所以它总是返回false,因为您正试图将ResultSet
对象转换为字符串。我还将更改查询字符串。
无论播放器是否在数据库中,您都可以使用the SQL EXISTS Operator返回一个布尔值。
因此新的查询字符串如下所示:
String query = "select exists (select null from playerInfo where `playerID` = '"+p.getUniqueId().toString()+"');"
SQLCheckPlayer#hasPlayer()
就是这个:
String query = "select exists (select null from playerInfo where `playerID` = '" + p.getUniqueId().toString() + "');";
try {
if (sqlConnection.getDatabaseConnection() != null) {
Statement st = sqlConnection.getDatabaseConnection().createStatement();
ResultSet rs = st.executeQuery(query);
if (rs.next()) {
if (rs.getBoolean(1)) {
st.close();
Bukkit.broadcastMessage("Player successfully added");
return true;
}
}
st.close();
} else {
Bukkit.broadcastMessage("Database connection is null");
return false;
}
return false;
} catch (SQLException e) {
e.printStackTrace();
Bukkit.broadcastMessage("Sql Exception");
return false;
}