Блокировка базы данных Sqlite
Я новичок в sqlite тогда, когда пытаюсь выполнить следующий код. затем мне нужно подключиться и отобразить какой-то результат
package sqlwrapper; import java.io.File; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class SqLiteSQLWrapper implements SQLWrapper { private final String driver = "SQLite.JDBCDriver"; private final String protocol = "jdbc:sqlite:"; private final String dbName = "toolbox.dat"; private String dbPath = null; private Connection conn = null; /** * Single instance created upon class loading. */ private static final SqLiteSQLWrapper sqLiteInstance = new SqLiteSQLWrapper(); private SqLiteSQLWrapper() { } /** * Returns the singleton sqLite instance * @return sqLiteInstance */ public static SqLiteSQLWrapper getInstance() { try{ if(sqLiteInstance.conn == null || sqLiteInstance.conn.isClosed()) sqLiteInstance.conn = sqLiteInstance.getConnection(); }catch(Exception ex){ ex.printStackTrace(); return null; } return sqLiteInstance; } /** * Execute SQL statement for data definition and manipulation * @param sql Sql operation * @return success of executed operation */ public boolean execute(String sql) { Statement st = null; try { st =sqLiteInstance.conn.createStatement(); boolean successful = st.execute(sql); st.close(); return successful; } catch (SQLException e) { e.printStackTrace(); return false; } finally { try { st.close(); } catch(Exception e) {} } } /** * Execute SQL statement for data query * @param sql Sql operation * @return queryResult */ public QueryResult executeQuery(String sql) { QueryResult result = null; try { Statement st =sqLiteInstance.conn.createStatement(); result = new QueryResult(st, sql); } catch (Exception e) { e.printStackTrace(); } return result; } /** * Commit transaction */ public void commit() { try { conn.commit(); } catch(SQLException e) { e.printStackTrace(); } } /** * Commit transaction, delete temporary data * @return success of the operation */ public boolean flush() { try { conn.commit(); conn.close(); String dbPath = sqLiteInstance.dbPath +"/" +sqLiteInstance.dbName; File file = new File(dbPath); boolean succ = file.delete(); if(succ){ File dir = new File(sqLiteInstance.dbPath); dir.delete(); } } catch (SQLException e) { e.printStackTrace(); return false; } return true; } private Connection getConnection() throws SQLException { loadDriver(); //if(sqLiteInstance.dbPath == null){ sqLiteInstance.dbPath= System.getProperty("user.home") + "/.Toolbox" ; if (!(new File(sqLiteInstance.dbPath)).exists()){ boolean success = (new File(sqLiteInstance.dbPath)).mkdir(); if(!success) return null; } //} conn = DriverManager.getConnection( sqLiteInstance.protocol + "/" + sqLiteInstance.dbPath +"/" +sqLiteInstance.dbName , "", "" ); conn.setAutoCommit(false); return conn; } private void loadDriver() throws SQLException { try { System.loadLibrary("sqlite_jni"); //Class.forName(sqLiteInstance.driver); Class.forName("org.sqlite.JDBC"); } catch (ClassNotFoundException cnfe) { System.err.println("\nUnable to load the JDBC driver "); System.err.println("Please check your CLASSPATH."); cnfe.printStackTrace(System.err); } } }
**затем он отобразит сообщение об ошибке**
org.sqlite.SQLiteException: [SQLITE_LOCKED] A table in the database is locked (database table is locked) at org.sqlite.core.DB.newSQLException(DB.java:909) at org.sqlite.core.DB.newSQLException(DB.java:921) at org.sqlite.core.DB.execute(DB.java:822) at org.sqlite.core.CoreStatement.exec(CoreStatement.java:75) at org.sqlite.jdbc3.JDBC3Statement.execute(JDBC3Statement.java:61) at sqlwrapper.SqLiteSQLWrapper.execute(SqLiteSQLWrapper.java:60)
тогда как я могу решить эту проблему ? база данных sqlite заблокирована
Что я уже пробовал:
я пытаюсь отобразить результат
Richard MacCutchan
Что такое строки 60 и 61?
amanuelhaft
Строка 60 является частью этого кода
56 public boolean execute(String sql) {
57 оператор st = null;
58 попробуй {
59 st =sqLiteInstance.conn.createStatement();
60 логическое успешно = ст.выполнить(для SQL);
Ст 61.рядом();
62 возвращение успешно;
63 } catch (SQLException e) {
64 e.printStackTrace();
65 возвращать false;
66 } наконец-то {
67 попробовать {
Ст 68.рядом();
69 } catch(исключение e) {}
70 }
Но строка 61 является частью пакета Sqlite
Richard MacCutchan
Затем вам нужно проследить назад от последнего звонка, чтобы узнать, где был заблокирован стол.
amanuelhaft
хорошо, сэр, Спасибо за ваш ответ !
Richard Deeming
public boolean execute(String sql)
public QueryResult executeQuery(String sql)
Эти методы заставят вас написать код, который уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.
Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]