2017-04-02 44 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);