Автоинкрементная проблема - лучший способ добавлять записи в базу данных и отображать их одновременно - PullRequest
1 голос
/ 10 января 2012

Я использую базу данных SQLite и графический интерфейс Java. Информация, введенная в GUI, будет добавлена ​​в таблицу базы данных. Эта таблица содержит автоинкремент. В то же время я хочу отобразить информацию в графическом интерфейсе и изменить ее позже.

создание базы данных:

stat.executeUpdate("create table t1(ROWID INTEGER PRIMARY KEY AUTOINCREMENT, Value);";

добавление значений в базу данных:

Statement stat = con.createStatement();
String sql = "insert into t1 values ($next_id,'"+value+');";
stat.executeUpdate(sql);

Как сохранить идентификатор в моей программе, чтобы он был таким же, как в базе данных, и у меня был легкий доступ к моей базе данных?

Edit: Я попробовал решение, упомянутое в комментариях, и наткнулся на исключение NYI ...

String sql = "insert into t1 values($next_id,'"+value+"');";
PreparedStatement stmt = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
ResultSet res = stmt.getGeneratedKeys();
while (res.next()){
     int id = res.getInt(1);
     System.out.println(id);
}
con.commit();

попробовал также решение Рассела и получил еще одно исключение («не реализовано драйвером SQLite JDBC»):

String sql = "insert into t1 values($next_id,'"+value+"');";
Statement stat = con.createStatement();
stat.executeUpdate(sql);
stat.executeUpdate("SELECT LAST_INSERT_ROWID() from t1;", Statement.RETURN_GENERATED_KEYS);
ResultSet res = stat.getGeneratedKeys();
while (res.next()){
    int id = res.getInt(1);
    System.out.println(id);
}

Что я не так сделал?

Ответы [ 2 ]

0 голосов
/ 11 января 2012

Если вы не возражаете против использования библиотеки ORM, попробуйте sormula . Это сделает всю работу для колонки идентичности для вас. Все, что требуется, это аннотация @Column (identity = true) в поле POJO, которое должно быть автоматически увеличено.

Тестовые примеры в пакете org.sormula.tests.identity показывают, как это сделать. Настройка Sqlite Test и sqlitejdbc-v056.jar jar включены. Измените build.properties для запуска db.dir = sqlitejdbc.

0 голосов
/ 10 января 2012

Как насчет просто позвонить SELECT LAST_INSERT_ID()?Это возвращает последнее значение автоинкремента, сгенерированное для вашего соединения (не затронутое действиями других клиентов).

Альтернативно, глядя на Javadoc, кажется, что вы должны быть в состоянии сделать это с обычным Statement:

stat.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);
ResultSet keys = stat.getGeneratedKeys();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...