我正在开发一个简单的 Java 库,它将提供数据库访问。目前我正在访问 SQLite。我有一个名为 SQlite.java 的类,它只实现实例方法。下面是几个方法的实现:
public ResultSet retrieve(String query) {
try {
if (this.connection != null) {
this.statement = this.connection.createStatement();
return this.statement.executeQuery(query);
}
} catch (Exception e) {
System.err.println("[ERROR] " + e.getMessage());
}
return null;
}
public ResultSet listTables() {
try {
return this.retrieve("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name");
} catch (Exception e) {
System.err.println("[ERROR] " + e.getMessage());
}
return null;
}
public boolean hasTable(String tableName) {
try {
ResultSet rs = this.listTables();
while (rs.next()) {
if (rs.getString(1).equals(tableName)) {
return true;
}
}
} catch (Exception e) {
System.err.println("[ERROR] " + e.getMessage());
}
return false;
}
public void update(String query) {
try {
if (this.connection != null) {
this.statement = this.connection.createStatement();
this.statement.executeUpdate(query);
}
} catch (Exception e) {
System.err.println("[ERROR] " + e.getMessage());
}
}
public void dropTable(String tableName) {
try {
if (this.hasTable(tableName)) {
this.update("DROP TABLE " + tableName); // TEST!
} else {
System.err.println("[ERROR] Table '" + tableName + "' not found!");
}
} catch (Exception e) {
System.err.println("[ERROR] " + e.getMessage());
}
}
当我测试 dropTable() 方法时,我得到一个异常说“数据库表被锁定”。我猜这是由于可能在 hasTable() 方法中调用的非关闭 SELECT 语句。据我所知,即使在运行检索查询时数据库表也被锁定,因此在其他人尝试选择数据时无法更新表。但是如何解决这个问题,我不确定。有任何想法吗?