2016-06-27 16 views
0

Ich versuche, den Wert einer automatisch inkrementierten Spalte zu erhalten, wenn ich eine Einfügung in einer Tabelle durchführe. Ich benutze SQLite. Hier ist die Tabelle:Wert der autoinkrementierten Spalte beim Einfügen mit getGeneratedKeys() - falsches Ergebnis

CREATE TABLE `tasks` (
`task_id` INTEGER, 
`task_list_id` INTEGER, 
`task_name` VARCHAR(30), 
`task_due_date` TIMESTAMP, 
`task_created_date` TIMESTAMP, 
`done` BOOLEAN, 
PRIMARY KEY(task_id), 
FOREIGN KEY(`task_list_id`) REFERENCES `lists`(`list_id`) 
); 

Und hier ist mein Einsatzmethode:

public int add(Task task) throws Exception { 
     PreparedStatement statement = null; 
     try { 
      String SQL = "INSERT INTO TASKS (TASK_LIST_ID, TASK_NAME, DONE, TASK_CREATED_DATE) VALUES (?, ?, ?, CURRENT_TIMESTAMP)"; 
      statement = jdbcTemplate.getDataSource().getConnection() 
        .prepareStatement(SQL, new String[]{ "task_id" }); 
      statement.setInt(1, task.getListId()); 
      statement.setString(2, task.getTaskName()); 
      statement.setBoolean(3, task.isDone()); 
      statement.executeUpdate(); 

      ResultSet generatedKeys = statement.getGeneratedKeys(); 
      if (generatedKeys.next()) { 
       return (int)generatedKeys.getLong(1); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
      throw new Exception("Failed to add Task to DB: " + task.toString()); 
     } finally { 
      if (generatedKeys != null) { 
       generatedKeys.close(); 
      } 
      if (statement != null) { 
       statement.close(); 
      } 
     } 
     return -1; 
    } 

Das Problem ist, dass es nicht den Wert meiner task_id Spalte zurückgibt, sondern ein Wert, der für jeden Einsatz erhöht das mache ich. Wenn ich 9 Einfügungen gemacht habe, dann löschte sie alle, das nächste Mal, wenn ich add() anrufe, wird es immer noch 10 zurückgeben. Dies geschieht, obwohl ich meine Anwendung neu starte. Irgendeine Idee, was ich falsch mache? Ich habe auch eine andere Methode für eine andere Tabelle (Listen), wo ich fast genau den gleichen Code habe. Ich habe gerade gesehen, dass ein Eintrag in der Listentabelle erstellt wird, wenn ich die Methode add (Task task) nach dem Hinzufügen (Liste Liste) aufruft.

+0

Welche JDBC-Treiber verwenden Sie? –

+0

Ich benutze den sqlite-jdbc-Treiber. Ich werde wirklich frustriert, da ich das wirklich nicht wie erwartet funktionieren lassen kann. – user16655

Antwort

2

SQLite verfolgt die größte ROWID, die eine Tabelle jemals enthielt, mit einer internen Tabelle namens "sqlite_sequence". Die Tabelle sqlite_sequence wird automatisch erstellt und initialisiert, wenn eine normale Tabelle erstellt wird, die eine AUTOINCREMENT-Spalte enthält. Der Inhalt der Tabelle sqlite_sequence kann mit den normalen UPDATE-, INSERT- und DELETE-Anweisungen geändert werden. Aber Modifikationen an dieser Tabelle werden wahrscheinlich den AUTOINCREMENT-Schlüsselgenerierungsalgorithmus stören. Stellen Sie sicher, dass Sie wissen, was Sie tun, bevor Sie solche Änderungen vornehmen.

von SQLite docs Genommen

+0

Ok, es ist wahrscheinlich dieser Wert, der zurückgegeben wird. Nützlich zu wissen, warum es passiert! Ich muss herausfinden, wie ich den Wert der gesuchten Spalte ermitteln kann. Ich habe von Statement.RETURN_GENERATED_KEYS geändert, um die Spalte anzugeben, von der ich den Wert möchte, aber es hat nicht geholfen (siehe Bearbeiten im Code) – user16655

+0

Gibt es keine Möglichkeit, die ID einer Spalte in der Tabelle zu erhalten, die automatisch angegeben wird eine ID auf einem Einsatz? – user16655

+0

In der Theorie nach Ihrer Einfügung, wählen Sie entweder max (task_id) aus Aufgaben; oder Wählen Sie seq aus sqlite_sequence wobei name = 'tasks'; sollte Ihnen den verwendeten ID-Wert mitteilen. – topshot