2011-08-09 12 views
0

まず、私の近似的な英語を私に許してください。Android:PRIMARY KEYに対応しないFOREIGN KEYを持つINSERT

私は2番目(tb_garage)を参照する外部キーを持つ2つのテーブル、1(tb_facture)を持っている

私の問題は、私はtb_garageを参照する外部キーを与えることなくtb_factureに挿入することはできませんということです。

有効な外部キーを指定しても問題はありません。しかし、-1(または他のもの)を与えると、挿入されません。

私のアプリでは、請求書にガレージをリンクする義務がないので、これを行うことができなければなりません。ここで

は、挿入コードです:

private void saveState(){ 
    String libelleFac = etLibelleFac.getText().toString(); 
    String dateFac = tvDateAfficheeFac.getText().toString(); 
    String kmFac = etKmFac.getText().toString(); 
    String remarqueFac = etRemarqueFac.getText().toString(); 
    float montantFac = Float.parseFloat(etMontantFac.getText().toString()); 
    String datePaieFac = tvDateAfficheePaiement.getText().toString(); 

    if(mRowId == null){ 
     if (cbGarageFac.isChecked()){ 
      db.insererFacture(itemSpListeVhc, itemSpListeGar, dateFac, libelleFac, remarqueFac, kmFac, montantFac, datePaieFac); 
     } 
     else{ 
      db.insererFacture(itemSpListeVhc, -1, dateFac, libelleFac, remarqueFac, kmFac, montantFac, datePaieFac); 
     } 
    } 
} 

私が交換した場合は-1有効な外部キーによって、またはitemSpListeGarによって、それが動作します。あなたの助けのための

public long insererFacture(long fkVhcFac, long fkGarFac, String dateFac, String libelleFac, String remarqueFac, String kmFac, float montantFac, String datePaieFac){ 
    ContentValues values = new ContentValues(); 
    values.put("fk_vhc_fa", fkVhcFac); 
    values.put("fk_gar_fa", fkGarFac); 
    values.put("date_fa", dateFac); 
    values.put("libelle_fa", libelleFac); 
    values.put("remarque_fa", remarqueFac); 
    values.put("kilometrage_fa", kmFac); 
    values.put("montant_fa", montantFac); 
    values.put("date_paie_fa", datePaieFac); 
    return db.insert("TB_FACTURE", null, values); 
} 

ありがとう:

は、ここに私のクエリです!

PS:私は、私は本当の外部キーを使用しないことを指定しますが、このようなものですトリガ方法:

"fk_gar_fa INTEGER CONSTRAINT ct_fk_gar_fa REFERENCES TB_GARAGE(_id)," 
+0

FK列にNULLを許可していますか? NULLを挿入してください。 – Jacob

+0

nullで置き換えると、長い型が必要なので、コードに間違いがあります。 – HerrM

+0

正確な表構造を知らないと、私は確信が持てませんが、逆の関係になっている可能性があります。あなたがファクトでレコードを持っていなければならないが、ファクシミリを参照してファクシミリをガレージに入れてみる。 fkの問題を解決し、関係をより正確にモデル化します。 –

答えて

0

あなたは、これを回避することはできませんリレーショナルデータベースの基本であるreferential integrityを強制します!

あなたのケースでは、「ガレージなし」というGarageレコードを作成することをおすすめします。また、関連付けられたガレージを持たないFactureテーブルにレコードを追加するときに、プライマリキーを外部キーとして使用します。

これは少し醜いですが、これを行うか、リレーショナルデータベースを変更しても完全性を失わないようにして、新しいワームの缶を開けます。 :)

+0

私は実際の外部キーを使わず、トリガー方法を指定します(私の投稿を編集します)。参照整合性は適用されません。 私が理解していないことは、自分のメソッドを使った例があることです。 – HerrM

+0

なぜトリガーが表示されるのですか?「私のアプリではガレージを請求書にリンクする義務ではないので、これを行う必要があります。」トリガーの目的は何ですか?なぜNULLを受け入れる外部キー列を作るのですか? – Bazzz

+0

Android 2.1 Eclairのアプリケーションにアクセスする必要があります。また、FOREIGN KEYSはそのバージョンではサポートされていません(SQLITの旧バージョンが含まれているため)。だから私はこの方法を使用しています。 しかし、原則は同じですし、fk_gar_faはNULLを受け入れることになっています。なぜそれは機能しませんか?私はdb.insererFactureに書き込むことはできませんが、長い型が必要だと言います。 – HerrM

関連する問題