Я пишу программу, которая использует локальную базу данных SQL для хранения данных.База данных JDBC SQL заблокирована?
Я использую драйвер здесь: https://bitbucket.org/xerial/sqlite-jdbc
Я пытаюсь читать из базы данных и поместить содержимое TABLENAME в JTable так:
public Object[][] getTable(String tableName){
int columns = getColumnNumber(tableName);
int rows = getRowNumber(tableName);
String[] columnNames = getColumnNames(tableName);
Object[][] table = new Object[rows][columns];
try{
Connection connection = DriverManager.getConnection("jdbc:sqlite:" + dbName + ".db");
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("select * from " + tableName);
for(int r = 0; r < rows; r++){
rs.next();
for (int c = 0; c < columns; c++){
table[r][c] = rs.getString(columnNames[c]);
}
}
return table;
}catch(Exception e){
System.out.println("ERROR CREATING TABLE ARRAY");
e.printStackTrace();
return null;
}
}
Позже я пытаюсь прийти назад и добавьте строку в таблицу:
public boolean addRow(String tableName, Object[] values){
if(!isDataAcceptable(tableName, values))
return false;
try{
String stmt = "insert into " + tableName + " values (";
for(int c = 0; c < values.length; c++){
if(values[c] instanceof String)
stmt += "'" + values[c] + "'";
else
stmt += values[c];
if(c == (values.length - 1))
stmt += ");";
else
stmt += ", ";
}
System.out.println(stmt);
Connection connection = DriverManager.getConnection("jdbc:sqlite:" + dbName + ".db");
Statement statement = connection.createStatement();
statement.executeUpdate(stmt);
return true;
}catch(Exception e){
System.out.println("ERROR INSERTING ROW");
e.printStackTrace();
return false;
}
}
Я хочу обновить созданный ранее JTable с помощью новой строки.
Когда я пытаюсь добавить строку, однако это вызывает исключение:
java.sql.SQLException: database is locked
, что указывает на линии:
statement.executeUpdate(stmt);
... в методе addRow().
Почему заблокирована база данных и как ее разблокировать, чтобы написать ей?
Вы не закрываете ни один из объектов, которые вы создаете, ни «ResultSet», ни «Statement», ни «Connection». Я подозреваю, что это твоя проблема. –
Я чрезвычайно новичок в SQL и предположил, что, поскольку они были локальными ресурсами, они закрывались при завершении метода. Как их закрыть? – user1113827
Как и любой другой внешний ресурс Java, вам нужно называть 'close()' тогда, когда вы закончите. Обычно используется шаблон «try finally». –