Android: ВСТАВЬТЕ ИНОСТРАННЫЙ КЛЮЧ, который не соответствует ПЕРВИЧНОМУ - PullRequest
0 голосов
/ 09 августа 2011

Во-первых, пожалуйста, прости меня за мой приблизительный английский.

У меня есть 2 таблицы, одна (tb_facture) с внешним ключом, ссылающимся на вторую (tb_garage)

Моя проблема в том, что я могуНЕ ВСТАВЛЯЙТЕ в tb_facture без предоставления внешнего ключа, который ссылается на tb_garage.

Если я предоставлю действительный внешний ключ, проблем не будет.Но если я пытаюсь дать -1 (или что-то еще), он не вставляется.

Я должен быть в состоянии сделать это, потому что в моем приложении не обязательно привязывать гараж кinvoice.

Вот код вставки:

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),"

1 Ответ

0 голосов
/ 09 августа 2011

Вы не можете обойти это, принудительная ссылочная целостность лежит в основе реляционных баз данных!

В вашем случае я бы предложил сделать запись Garage, которая гласит: «Нет гаража».И используйте его первичный ключ в качестве внешнего ключа при добавлении записи в таблицу Facture, которая не имеет связанного гаража.

Это немного уродливо, но либо это, либо вы измените свою реляционную базу данных, чтобы больше не применятьцелостность, и вы откроете новую банку с червями.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...