2014-11-04 3 views
-1

Я использую SQLite-JDBC-3.8.1 (см. https://bitbucket.org/xerial/sqlite-jdbc/downloads), и я просто хочу вставить кортеж в таблицу, где мой первичный ключ автоматически увеличивается.Java SQLite JDBC - Вставка с помощью автоинкремента

Таблица создается как

CREATE TABLE image (
     ID INTEGER PRIMARY KEY, 
     PATH TEXT, 
     NAME TEXT 
); 

Я использую SQLite JDBC для подключения к базе данных. У меня есть метод

public int insertImage(String path, String name) 
{ 
    int newID = -1; 

    try 
    { 
     stmt = connect.createStatement(); 
     if(stmt == null) 
     { 
      System.out.println("Abort: Could not create statement."); 
      return -1; 
     } 
     else 
     { 
      stmt.executeUpdate("INSERT INTO image (path, name) VALUES(\"" + path +"\", \"" + name + "\")"); 
      System.out.println("NOCH OK"); 
      //resultSet = stmt.getGeneratedKeys(); 

      if(resultSet.next()) 
       newID = resultSet.getInt(1); 

      return newID; 
     } 
    } 
    catch(SQLException ex) 
    { 
     System.out.println("An unexpected error occured: Statement \"INSERT INTO image (path, name) VALUES [...]\" could not be executed properly."); 
     System.out.println("SQLExeption: " + ex.getMessage()); 
     System.out.println("SQLState: " + ex.getSQLState()); 
     System.out.println("VendorError: " + ex.getErrorCode()); 

     return -1; 
    } 
    finally 
    { 
     close("insertImage"); 
    } 
} 

который должен вставить новый кортеж в данную таблицу. Но каждый раз, когда я получаю ошибку.

An unexpected error occured: Statement "INSERT INTO image (path, name) VALUES [...]" could not be executed properly. SQLExeption: NOT NULL constraint failed: image.ID SQLState: null VendorError: 0

Я не знаю, почему Java и JDBC говоря мне image.ID NOT NULL ограничение. Использование командной строки с помощью одного и того же оператора просто отлично работает. Я искал в Интернете около 1 часа, но, похоже, нет ответа на это поведение.

java.sql.SQLException: NOT NULL constraint failed: image.ID 
VendorError: 0 
    at org.sqlite.core.NativeDB.throwex(NativeDB.java:397) 
    at org.sqlite.core.NativeDB._exec(Native Method) 
    at org.sqlite.jdbc3.JDBC3Statement.executeUpdate(JDBC3Statement.java:116) 
    at util.MySQLAdapter.insertImage(MySQLAdapter.java:288) 
    at view.controller.ControllerTabOverviewImageDialog.handleOk(ControllerTabOverviewImageDialog.java:109) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71) 
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275) 
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1765) 
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1651) 
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) 
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) 
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49) 
    at javafx.event.Event.fireEvent(Event.java:204) 
    at javafx.scene.Node.fireEvent(Node.java:8175) 
    at javafx.scene.control.Button.fire(Button.java:185) 
    at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182) 
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96) 
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89) 
    at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218) 
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) 
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) 
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49) 
    at javafx.event.Event.fireEvent(Event.java:204) 
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3746) 
    at javafx.scene.Scene$MouseHandler.access$1800(Scene.java:3471) 
    at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1695) 
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2486) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:314) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:243) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:345) 
    at com.sun.glass.ui.View.handleMouseEvent(View.java:526) 
    at com.sun.glass.ui.View.notifyMouse(View.java:898) 
    at com.sun.glass.ui.win.WinApplication._enterNestedEventLoopImpl(Native Method) 
    at com.sun.glass.ui.win.WinApplication._enterNestedEventLoop(WinApplication.java:142) 
    at com.sun.glass.ui.Application.enterNestedEventLoop(Application.java:495) 
    at com.sun.glass.ui.EventLoop.enter(EventLoop.java:107) 
    at com.sun.javafx.tk.quantum.QuantumToolkit.enterNestedEventLoop(QuantumToolkit.java:543) 
    at javafx.stage.Stage.showAndWait(Stage.java:415) 
    at view.controller.ControllerTabOverview.showTabOverviewImageDialog(ControllerTabOverview.java:246) 
    at view.controller.ControllerTabOverview.handleInsertImage(ControllerTabOverview.java:201) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71) 
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275) 
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1765) 
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1651) 
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) 
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) 
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49) 
    at javafx.event.Event.fireEvent(Event.java:204) 
    at javafx.scene.Node.fireEvent(Node.java:8175) 
    at javafx.scene.control.Button.fire(Button.java:185) 
    at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182) 
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96) 
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89) 
    at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218) 
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) 
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) 
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54) 
    at javafx.event.Event.fireEvent(Event.java:204) 
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3746) 
    at javafx.scene.Scene$MouseHandler.access$1800(Scene.java:3471) 
    at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1695) 
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2486) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:314) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:243) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:345) 
    at com.sun.glass.ui.View.handleMouseEvent(View.java:526) 
    at com.sun.glass.ui.View.notifyMouse(View.java:898) 
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
    at com.sun.glass.ui.win.WinApplication.access$300(WinApplication.java:39) 
    at com.sun.glass.ui.win.WinApplication$4$1.run(WinApplication.java:112) 
    at java.lang.Thread.run(Thread.java:744) 

РЕШИТЬ: Я идиот ... У меня есть две базы данных (один в ../program/database/images.db и один в ../program/images.db), и я случайно загрузил неправильную базу данных в моем приложении. Сейчас все работает отлично. <

+0

Почему это имеет значение? Я использовал MySQL JDBC раньше ... с MySQL данный метод/оператор просто отлично работал. Кажется, проблема с SQLite или, возможно, с его JDBC ... –

+0

Я читаю несколько изображений, получаю их файловые пути и имена файлов и просто вызываю этот insertImage (путь, имя) из другого класса. На самом деле это не проблема. Кажется, что есть некоторые проблемы с AUTOINCREMENT в SQLite –

ответ

2

Вы делаете много вещей, которые делают эту работу сложнее, чем она должна быть:

  1. Использование PreparedStatement и связать переменные
  2. Печать или войти трассировки стека вместо печати сообщений, которые имеют за вычетом информации
  3. Заявление о закрытии и ResultSet в конце блока
+0

Stack Trace есть. Я также попробовал PrepStatements, по-прежнему получил ту же ошибку. Заявления закрываются должным образом в блоке finally (close ("insertImage") вызывает метод, при котором все операторы закрываются) –

+0

Нет, я не сделал это неправильно. Трассировки стека не было раньше. – duffymo