Вот как выглядит мой код:
import java.sql.*
import java.sql.SQLException
class SqliteDB {
val conn = DriverManager.getConnection("jdbc:sqlite:cs2820-database.db")
fun createUser123(userID: String, password: String, adminStatus: String) {
val statement = conn.prepareStatement("INSERT INTO Users(id,pass,admin) VALUES(?,?,?)")
statement.setString(1, userID)
statement.setString(2,password)
statement.setString(3,adminStatus)
println("123")
statement.executeUpdate()
conn.commit()
println("User Created")
}
// create a user
fun createUser(userID: String, password: String, adminStatus: String) {
println("inside createUser")
val sql = "INSERT INTO Users(id,pass,admin) VALUES(?,?,?)"
Class.forName("org.sqlite.JDBC")
try {
conn.use { conn ->
conn.prepareStatement(sql).use { pstmt ->
pstmt.setString(1, userID)
pstmt.setString(2, password)
pstmt.setString(3, adminStatus)
pstmt.executeUpdate()
//conn.commit()
pstmt.close()
}
}
} catch (e: SQLException) {
println(e.message)
}
}
fun main(args: Array<String>) {
val db = SqliteDB()
db.createUser("Jim", "password", "false")
}
Я протестировал два разных createUser
метода, и почти все, что я пробовал, вернет ошибку [SQLITE_BUSY] Файл базы данных заблокирован (база данных заблокирована). У меня есть несколько других методов в том же классе SqliteDB, которые запрашивают данные («SELECT»), которые все работают правильно, но каждый раз, когда я пытаюсь выполнить какое-либо обновление информации, мне выдается одна и та же ошибка. Я в растерянности из-за того, что делать в данный момент, просмотрев множество различных форумов и сообщений о синтаксисе и тому подобном.
Полная трассировка стека выглядит следующим образом:
Exception in thread "main" org.sqlite.SQLiteException: [SQLITE_BUSY] The database file is locked (database 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.DB.executeUpdate(DB.java:863)
at org.sqlite.jdbc3.JDBC3PreparedStatement.executeUpdate(JDBC3PreparedStatement.java:99)
at SqliteDB.createUser(SqliteDB.kt:50)
at SqliteDBKt.main(SqliteDB.kt:122)
Я не верю, что проблема связана с открытым соединением, так как кажется, что ошибка возникает, как только я пытаюсь выполнить обновление таблицы User. Кажется, вставка попала в какой-то цикл на стадии выполнения.
РЕДАКТИРОВАТЬ : Что-то еще, что я заметил, это то, что при попытке создать нового пользователя с уже существующим первичным ключом (userID) я получаю сообщение об ошибке уникальности, предполагающее, что обновление выполняется и реализация userID уже находится в таблице; однако по-прежнему существует проблема с INSERT, создающим новую строку в таблице. Я просто не знаю, как отладить эту конкретную проблему.