JDBC не хранит обновления в базе данных sqlite - PullRequest
1 голос
/ 20 сентября 2011

Я написал приложение, которое вставляет некоторые данные в базу данных SQlite, используя JDBC, и имеет возможность чтения / обновления этих данных.
Проблема заключается в том, что когда я изменяю данные приложением, оно обновляет данные, а когда программа открыта, чтение этих данных дает новые (обновленные) данные.
Но когда я выхожу из программы и перезапускаю ее, все эти изменения теряются, и данные сбрасываются до того момента, когда программа открывается в первый раз!
Я подключаюсь так:

Class.forName("org.sqlite.JDBC");
con=DriverManager.getConnection("jdbc:sqlite:archive.sqlite");

и затем обновите четыре таблицы следующим образом:

try{
    String Q="UPDATE data SET startdate=?,fazelab=?,length=?,maliat=?,other=?,price=?,public=?,usage=?,abbaha=?,enddate=? WHERE id='"+ID+"'";
    PreparedStatement PS= this.con.prepareStatement(Q);
    PS.setString(1, (String)data.get("startdate"));
    PS.setInt(2, (Integer)data.get("fazelab"));
    PS.setInt(3, (Integer)data.get("length"));
    PS.setInt(4, (Integer)data.get("maliat"));
    if(data.containsKey("other"))
        PS.setInt(5, (Integer)data.get("other"));
    else
        PS.setInt(5, 0);
    PS.setLong(6, (Long)data.get("price"));
    PS.setDouble(7, (Double)data.get("public"));
    PS.setInt(8, (Integer)data.get("usage"));
    PS.setInt(9, (Integer)data.get("abbaha"));
    PS.setString(10, (String)data.get("enddate"));
    COUNT=PS.executeUpdate();

    Q="UPDATE cold SET cE1=?,cW1=?,cE2=?,cW2=?,cE3=?,cW3=?,cE4=?,cW4=? WHERE dataid='"+ID+"'";
    PS= this.con.prepareStatement(Q);
    PS.setDouble(1, cold.get("cE1"));
    PS.setDouble(2, cold.get("cW1"));
    PS.setDouble(3, cold.get("cE2"));
    PS.setDouble(4, cold.get("cW2"));
    PS.setDouble(5, cold.get("cE3"));
    PS.setDouble(6, cold.get("cW3"));
    PS.setDouble(7, cold.get("cE4"));
    PS.setDouble(8, cold.get("cW4"));
    COUNT+=PS.executeUpdate();

    Q="UPDATE hot SET hE1=?,hW1=?,hE2=?,hW2=?,hE3=?,hW3=?,hE4=?,hW4=? WHERE dataid='"+ID+"'";
    PS= this.con.prepareStatement(Q);
    PS.setDouble(1, hot.get("hE1"));
    PS.setDouble(2, hot.get("hW1"));
    PS.setDouble(3, hot.get("hE2"));
    PS.setDouble(4, hot.get("hW2"));
    PS.setDouble(5, hot.get("hE3"));
    PS.setDouble(6, hot.get("hW3"));
    PS.setDouble(7, hot.get("hE4"));
    PS.setDouble(8, hot.get("hW4"));
    COUNT+=PS.executeUpdate();

    Q="UPDATE usages SET E1=?,W1=?,E2=?,W2=?,E3=?,W3=?,E4=?,W4=? WHERE dataid='"+ID+"'";
    PS= this.con.prepareStatement(Q);
    PS.setDouble(1, USGs.get("E1"));
    PS.setDouble(2, USGs.get("W1"));
    PS.setDouble(3, USGs.get("E2"));
    PS.setDouble(4, USGs.get("W2"));
    PS.setDouble(5, USGs.get("E3"));
    PS.setDouble(6, USGs.get("W3"));
    PS.setDouble(7, USGs.get("E4"));
    PS.setDouble(8, USGs.get("W4"));
    COUNT+=PS.executeUpdate();

    PS.close();
}finally{
    return COUNT;
}

В чем проблема?
Спасибо

Ответы [ 3 ]

2 голосов
/ 20 сентября 2011

Есть три пункта, которые вы должны проверить:

  • все ли ресурсы, как PreparedStatement, ResultSet и т. Д., Закрыты перед выдачей следующих операторов?Также правильно закройте Connection в конце.

  • Каков ваш статус autocommit ?Проверьте это на Connection с getAutoCommit().Если это неверно, вы должны выдать Connection.commit() вручную.Это параметр, который различается в разных базах данных. Чаще всего он по ошибке опускается.

  • Проверьте настройку самой базы данных: sqlite является встроенной базой данных, и иногда для простоты они имеют странные настройки по умолчанию.запуск или юнит-тестирование.Например: «Запустить меня только в памяти» или «Обрезать всю таблицу при запуске».Не смейся, я видел такие вещи!Проверьте документацию для этого.

1 голос
/ 20 сентября 2011

В finally имеется оператор return , который проглатывает все исключения. Не делай этого .Если вы переместите возврат за пределы finally, вы увидите, в чем проблема.

1 голос
/ 20 сентября 2011

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

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