2017-04-02 71 views
0

我有一個table tableGrupo(Groups),它具有來自其他表tableMaquinas(Machines)的外鍵。當我在表tableGrupo(Groups)中插入數據時,Android Studio告訴我外鍵字段不能爲空,因爲它是外鍵。如何在Android中的SQLite中插入foreignKey值?

爲了讓插入接受並將正確的外鍵ID傳遞給我應該賦予什麼值?

這是我的代碼:

//Table1 
     db.execSQL("CREATE TABLE "+ tableGrupo +" ("+ 
       idGrupo +" INTEGER PRIMARY KEY AUTOINCREMENT, "+ 
       nomeGrupo +" TEXT)"); 

     //Table2 
     db.execSQL("CREATE TABLE "+ tableMaquinas +" ("+ 
       idMaquina +" INTEGER PRIMARY KEY AUTOINCREMENT, " 
       + nomeMaquina + " text not null, " 
       + imagemMaquina + " BLOB, " 
       + id_grupo + " integer, " 
       + " FOREIGN KEY ("+id_grupo+") REFERENCES "+tableGrupo+"("+idGrupo+"))"); 


**This is the code where I make the insertion in the database** 

public void addMachine(String name, byte[] image) throws SQLiteException { 
     ContentValues values = new ContentValues(); 
     values.put(nomeMaquina,name); 
     values.put(imagemMaquina,image); 
     //here i have to put a value for the foreignkey 
     this.getWritableDatabase().insert(tableMaquinas,null,values); 
    } 
+0

與關係數據庫中的想法是,它可以訪問該數據,其中第外鍵所指向。所以FOREIGN KEY指向的ID應該已經存在。如果它不是這樣的數據庫沒有意義。如果存在,您的密鑰不爲空。所以,也許有一點誤會......你必須有一個有效的外鍵... – Opiatefuchs

+0

但是,當我添加一些東西時,外鍵的值是空的,android studio會一直在竊聽我! – jose

+0

你永遠不會將值賦給id_grupo,因此,sqlite無法將你的Maquina關聯到Grupo(順便說一句,強烈建議在所有表中標準化變量命名 - id_grupo或idGrupo)。 Android Studio不是代理,它只是一個在物理或虛擬設備上運行的IDE(模擬器不是Android工作室本身),而是一個IDE(ambiente interacttivo de desenvolvimento)代碼,適用於Android studio ,即使您可能正在使用AVD/Android監視器窗口看到它,也是發生錯誤的位置。 –

回答

1

你的表tableMaquinas定義列id_group作爲具有外鍵指向在tableGrupo表的主鍵列的整數。因此,除了要求之外,它必須指向實際存在的tableGrupo表中的記錄。

這裏是代碼應與當前的模式工作:

ContentValues values = new ContentValues(); 
values.put(idGrupo, 1); 
this.getWritableDatabase().insert(tableGrupo, null, values); 

ContentValues values = new ContentValues(); 
values.put(nomeMaquina, name); 
values.put(imagemMaquina, image); 
values.put(id_grupo, 1); 
this.getWritableDatabase().insert(tableMaquinas, null, values); 

注意,我假定上面的某些變量存在(多數已經做),但你可能要稍微改變上面的代碼來獲得它以你的特定方法工作。

+0

但是通過這種方式,外鍵永遠是「1」,無論插入多少次,它總是會指向tableGrupo的第一行?還是我錯了? – jose

+0

您需要決定如何解決此問題。我只給你一個工作的例子,所以你可以看到你需要處理的事情。當然,你可以用對應於特定組的變量替換1。 –

+0

如何在不使用光標的情況下查詢組並獲取它們的ID? – jose

0

我知道這是一個老問題,但我認爲我有一個合理的解決方法。可以保存以從插入方法返回值並將其保存在變量中。如果插入成功,則成功時返回_id,失敗時返回-1。這裏是Documentation的參考。

ContentValues values = new ContentValues(); 
values.put(idGrupo, 1); 
long sucess = this.getWritableDatabase().insert(tableGrupo, null, values); 
values.clear(); 

values.put(nomeMaquina, name); 
values.put(imagemMaquina, image); 
values.put(id_grupo, success); 
this.getWritableDatabase().insert(tableMaquinas, null, values); 
相關問題