База данных заблокирована в SQLite [Java] - PullRequest
0 голосов
/ 03 января 2019

обновлено

try
        {
            sqlite.setDbPath(dbPath);
            con = sqlite.connect();
            if(!con.isClosed()) 
            {
                String query="SELECT Username,Password FROM Apps WHERE Username ='"+username+"'"; // and Password='"+password+"'";
                ResultSet rs = con.createStatement().executeQuery(query);
                while(rs.next())
                {
                        if(rs.getString("Username").equals(username))//confronto se Username è gia esistente
                        {
                            trovato = true;
                            risultato = "gia' presente";
                        }
                }

                if(trovato==false) {
                    createUsers(username,password,name,surname,email,appname,ip,authorized,token);
                    risultato="inserito";
                }

                if(con!=null)
                {
                    con.close();
                }
                if(sqlite != null)
                {
                    sqlite.close();
                }
                if(rs != null)
                {
                    rs.close();
                }
            }

В блоке try catch я открываю соединение со встроенной базой данных, но в первый раз не закрываю все соединения .. С помощью if control the closeвсе открытое соединение и работает хорошо

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Решено

Я делаю ошибки с открытым и закрытым соединением в Main .. С SQLite соединение вы должны открывать и закрывать каждый раз, когда выполняется запрос любого типа (Вставить,Удалить, обновить ecc ..)

0 голосов
/ 03 января 2019

Обновление 2

Вот сокращенная версия с использованием try-with-resource. Код проще и короче

public String RegisterUser(... ) {
    boolean trovato = false;
    int authorized=0;

    SqliteConnection sqlite = new SqliteConnection();
    String dbPath="C:/Users/l.pellegrini/eclipse-workspace/ClayAPI_dbembedded/claydb.db";
    String query="SELECT Username,Password FROM Apps WHERE Username ='"+username+"' and Password='"+password+"'";

    try (java.sql.Connection con = sqlite.connect();
         Statement statement = con.createStatement();
         Statement updStatement = con.createStatement();
         ) {
        ResultSet rsActiveServices = con.createStatement().executeQuery(query);
        // handle result set as before
    } catch(SQLException e) {
        e.printStackTrace();
        System.out.println("errore" + e);
    }
    if(trovato==false) {
        createUser(username, password, name, surname, appname, email, ip)
    }
    return "username: " + username;
}


private createUser(String username, String password, String name, String surname, String appname, String email, String ip {
    String query1="INSERT INTO Apps (Username,Password,Name,Surname,Email,AppName,Ip,Authorized,Token) VALUES ('" + username + "'," + "'" +password +"','" + name + "','" + surname + "','" +email + "','" + appname + "','"+ip+"','"+authorized+"','"+token+"')";         
    SqliteConnection sqlite = new SqliteConnection();
    String dbPath="C:/Users/l.pellegrini/eclipse-workspace/ClayAPI_dbembedded/claydb.db";

    try (java.sql.Connection con = sqlite.connect();
         Statement statement = con.createStatement();) {
        updStatement.executeUpdate(query1);
    } catch(SQLException e) {
        e.printStackTrace();
        System.out.println("errore" + e);
    }
}

Вполне может быть, что ваше подготовленное заявление не закрыто должным образом. Изменение

ResultSet rsActiveServices = con.createStatement().executeQuery(query);

до

statement = con.createStatement();
ResultSet rsActiveServices = statement.executeQuery(query);

где оператор объявляется раньше try

java.sql.Connection con = null;
Statement statement = null;

и затем закройте его в своем finally предложении

finally
{
    try
    {
        statement.close();
        con.close();
        sqlite.close();
    }

Обновление 1

Я только что заметил, что вы пытаетесь закрыть объекты дважды, что неправильно, удалить первый набор вызовов close и закрыть только в пределах finally {} в конце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...