2017-04-02 5 views
0

私は他のテーブルtableMaquinas(マシン)からの外部キーを持つテーブルtableGrupo(グループ)を持っています。テーブルtableGrupo(Groups)にデータを挿入するとき、Android Studioは外部キーフィールドが外部キーであるためnullであってはならないことを伝えます。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が指すデータにアクセスできるということです。したがって、FOREIGN KEYが指すIDはすでに存在するはずです。そうでなければ、そのような種類のデータベースには意味をなさない。それが存在する場合、あなたの鍵はnullではありません。だから多少の誤解がある...あなたは有効な外字キーを持っている必要があります... – Opiatefuchs

+0

しかし、アンドロイドスタジオは、私が何かを追加したときに外来キーの値がnullであると私に迷惑をかけることがあります。 – jose

+0

あなたは決してid_grupoに値を指定しないので、sqliteはあなたのMaquinaをGrupoに関連付けます(ちなみに、すべてのテーブルで変数の命名を標準化することを強くお勧めします - id_grupoまたはidGrupo)。 Android Studioはエージェントではなく、物理的または仮想的なデバイス上で実行されるIDE(ambiente interativo de desenvolvimento)コードです(エミュレータはアンドロイドスタジオ固有のものではありません)、アンドロイドスタジオはアンドロイドスタジオAVD/Android Monitorウィンドウを使用して表示されているかもしれませんが、エラーが発生する場所です)。 –

答えて

1

あなたのテーブルtableMaquinastableGrupoテーブルの主キー列を指している外部キーを持つ整数としてのカラムid_groupを定義します。したがって、実際に存在するテーブル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

グループを照会して、Cursorを使用せずにIDを取得するにはどうすればよいですか? – jose

0

これは古い質問ですが、私は妥当な回避策があると思います。 insertメソッドから戻り値を保存し、変数に保存することは可能です。挿入が成功すると、成功した場合は_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); 
関連する問題