2016-03-18 100 views
0

我目前正在学习JavaFX和Sqlite。JavaFX Sqlite插入外键

我有我与MySQL的经理建立了一个SQLite数据库,已经有外键的规则等

例如用户和地址:

CREATE TABLE "Benutzer" ("Benutzername" TEXT PRIMARY KEY NOT NULL , "Vorname" VARCHAR, "Nachname" VARCHAR, "Email" TEXT UNIQUE , "Passwort" TEXT, "AdresseID" INTEGER, FOREIGN KEY(AdresseID) REFERENCES Adresse(AdresseID)) 

CREATE TABLE "Adresse" ("AdresseID" INTEGER PRIMARY KEY NOT NULL , "Land" VARCHAR, "Stadt" VARCHAR, "Straße" TEXT, "Hausnr." INTEGER) 

我连接数据库,以我的JavaFX应用程序,现在我正在尝试创建注册功能,因此新用户可以在fxml模板中填写“Benutzername”,“Vorname”等,以及他的地址“Land”,“Stadt”等。

Here形式如下:

enter image description here

添加这些值到数据库的作品,但我没有一个想法如何告诉JavaFX的是其插入该当前用户必须采取其插入当前ADRESS(其AdressID)为外键。

用户插入不用担心外键: enter image description here

我是指导员研究和发现事物一样

mysql_insert_id返回由当前正在使用的数据库连接生成的最后一个自动递增值。

但我不知道如何访问它。

这就是我的模型,我用它来填补数据到我的数据库:

public class RegisterModel { 
Connection conection; 

// Konstruktor 
public RegisterModel() { 
    conection = SqliteConnection.Connector(); 

    // Wenn die Verbindung nicht erfolgreich ist, dann App schließen 
    if (conection == null) { 
     System.out.println("connection not successful"); 
     System.exit(1); 
    } 
} 

public boolean isDbConnected() { 
    try { 
     return !conection.isClosed(); 
    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     return false; 
    } 
} 

public boolean RegisterUser(String user_benutzername, String user_vorname, String user_nachname, String user_email, 
     String user_passwort, String adress_land, String adress_stadt, String adress_strasse, 
     String adress_hausnummer) throws SQLException { 

    PreparedStatement preparedStatement = null; 
    PreparedStatement preparedStatement_for_adress = null; 

    // or ignore besprechen 
    String query = "insert or ignore into Benutzer (Benutzername, Vorname, Nachname, Email, Passwort) values(?,?,?,?,?)"; 
    String query_adress = "insert into Adresse (Land, Stadt, Straße, 'Hausnr.') values(?,?,?,?)"; 

    try { 
     preparedStatement = conection.prepareStatement(query); 

     preparedStatement.setString(1, user_benutzername); 
     preparedStatement.setString(2, user_vorname); 
     preparedStatement.setString(3, user_nachname); 
     preparedStatement.setString(4, user_email); 
     preparedStatement.setString(5, user_passwort); 
     System.out.println("Benutzer wurde eingefuegt"); 

     preparedStatement_for_adress = conection.prepareStatement(query_adress); 

     preparedStatement_for_adress.setString(1, adress_land); 
     preparedStatement_for_adress.setString(2, adress_stadt); 
     preparedStatement_for_adress.setString(3, adress_strasse); 
     preparedStatement_for_adress.setString(4, adress_hausnummer); 
     System.out.println("Adresse wurde eingefügt"); 

     preparedStatement.executeUpdate(); 
     preparedStatement_for_adress.executeUpdate(); 
     return true; 

    } catch (Exception e) { 
     e.printStackTrace(); 
     return false; 
    } finally { 
     preparedStatement.close(); 
     preparedStatement_for_adress.close(); 

    } 
} 

}

我认为必须有一个第三查询这需要当前ADRESS的AdressID并给它分配作为他的地址给当前用户?因此,多数民众赞成在interessting部分:

String query = "insert or ignore into Benutzer (Benutzername, Vorname, Nachname, Email, Passwort) values(?,?,?,?,?)"; 
    String query_adress = "insert into Adresse (Land, Stadt, Straße, 'Hausnr.') values(?,?,?,?)"; 

回答

1
  1. 你应该插入Address先用PreparedStatement
  2. 检索Address的ID(最后插入的ID),见Java PreparedStatement retrieving last inserted ID
  3. 现在插入User在步骤2中陈述所以,你必须包括在用户INSERT INTO声明AddressIdAddressId

您的用户插入查询应该变成:

String query = "insert or ignore into Benutzer (Benutzername, Vorname, Nachname, Email, Passwort, AddressId) values(?,?,?,?,?,[put last_inserted_id here)"; 
+0

的AdressID在用户表已经创建,这就是为什么有一个红色的领域,但您的解决方案可以帮助!我之前用错了顺序,我现在正在吃,但会在20-30分钟内尝试。 – Roman

+0

@Roman是我的不好,我编辑了我的答案:)享受你的用餐! – Swag

+0

谢谢,这工作,现在可以开始工作,如果地址对于新用户来说是相同的,那么它不应该创建新的地址 – Roman