Autore Topic: Gestire database con chiavi esterne  (Letto 630 volte)

Offline cadupper

  • Utente junior
  • **
  • Post: 81
  • Respect: 0
    • cadupper
    • Mostra profilo
  • Dispositivo Android:
    HTC Magic Tim (32A)
  • Play Store ID:
    cadupper
  • Sistema operativo:
    Ubuntu 10.04
Gestire database con chiavi esterne
« il: 04 Maggio 2011, 15:09:52 CEST »
0
Ciao ragazzi, il database che sto creando associa a ciascun evento una serie di invitati, e una serie di spese associate a loro volta agli invitati.
Come faccio, una volta create le tabelle e indicato i riferimenti chi chiave esterna a fare delle modifiche?

ESEMPIO: Vorrei che al momento dell'eliminazione di un evento dalla tabella Events  tutte le righe nella tabella Expenses vengano cancellate automaticamente. C'è un modo per farlo avendo definito già le chiavi esterne?

Vi lascio il codice:

Codice: [Seleziona]
package it.unipd.dei.es1011.droidgrill;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseHelper extends SQLiteOpenHelper {
       
        static final String dbName="droigrillDB";
       
        //EVENTS
        static final String eveTable="EventsTable";
        static final String eveID="EventID";
        static final String eveName="EventName";
        static final String evePlace="EventPlace";
        static final String eveDate="EventDate";

        //PEOPLE
        static final String peoTable="PeopleTable";
        static final String peoID="PeopleID";
        static final String peoName="PeopleName";
        static final String peoPartec="PeoplePrtecipation";
       
        //EXPENSES
        static final String expTable="ExpensesTable";
        static final String expID="ExpensesID";
        static final String expEvent="ExpensesEvent";
        static final String expName="ExpensesName";
        static final String expBuyer="ExpensesBuyer";
        static final String expPrice="ExpensesPrice";
       
        static final String viewExps="ViewExps";
       
        public DatabaseHelper(Context context) {
                super(context, dbName, null,33);
        }
       
        @Override
        public void onCreate(SQLiteDatabase db) {
               
                //create EVENTStable
                db.execSQL("CREATE TABLE "+eveTable+" (" +
                                ""+eveID+ " INTEGER PRIMARY KEY AUTOINCREMENT , " +
                                ""+eveName+ " TEXT , " +
                                ""+evePlace+ " TEXT , " +
                                ""+eveDate+ " TEXT)");
               
                //create PEOPLEtable
                db.execSQL("CREATE TABLE "+peoTable+" (" +
                                ""+peoID+ " INTEGER PRIMARY KEY , " +   
                                ""+peoName+ " TEXT , " +
                                ""+peoPartec+ " INTEGER NOT NULL, FOREIGN KEY ("+peoPartec+") REFERENCES "+eveTable+" ("+eveID+"))");
               
                //create EXPENSEStable
                db.execSQL("CREATE TABLE "+expTable+" (" +
                                ""+expID+ " INTEGER PRIMARY KEY AUTOINCREMENT , " +
                                ""+expEvent+ " INTEGER NOT NULL , FOREIGN KEY ("+expEvent+") REFERENCES "+eveTable+" ("+eveID+") " +
                                ""+expName+ " TEXT , " +
                                ""+expBuyer+ " INTEGER NOT NULL , FOREIGN KEY ("+expBuyer+") REFERENCES "+peoTable+" ("+peoID+")" +
                                ""+expPrice+ " REAL)");
               
               
                //TRIGGER: expEvent ------> eveID        non posso inserire spese per un evento che non esiste
                db.execSQL("CREATE TRIGGER fk_expEvent_eveID " +
                                " BEFORE INSERT "+
                                " ON "+expTable+
                               
                                " FOR EACH ROW BEGIN"+
                                " SELECT CASE WHEN ((SELECT "+eveID+" FROM "+eveTable+" WHERE "+eveID+"=new."+expEvent+" ) IS NULL)"+
                                " THEN RAISE (ABORT,'Foreign Key Violation') END;"+
                                "  END;");
               

                //TRIGGER: peoPartec ------> eveID        non posso inserire partecipanti a un evento prima di aver creato l'evento
                db.execSQL("CREATE TRIGGER fk_expEvent_eveID " +
                                " BEFORE INSERT "+
                                " ON "+peoTable+
                               
                                " FOR EACH ROW BEGIN"+
                                " SELECT CASE WHEN ((SELECT "+eveID+" FROM "+eveTable+" WHERE "+eveID+"=new."+peoPartec+" ) IS NULL)"+
                                " THEN RAISE (ABORT,'Foreign Key Violation') END;"+
                                "  END;");

        }

}


Ah. ho seguito questa guida Using SQLite Database with Android - CodeProject
Non ho trovato molti esempi sulla creazione di database "referenziali" , sapete indicarmi della documentazione alternativa?

Grazie  ;-)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +507
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Gestire database con chiavi esterne
« Risposta #1 il: 04 Maggio 2011, 15:24:34 CEST »
0
Purtroppo non c'è una gestione dell'integrità referenziale come in altri RDBMS, l'unica soluzione è scrivere qualche trigger :)

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +203
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:Gestire database con chiavi esterne
« Risposta #2 il: 04 Maggio 2011, 15:38:31 CEST »
0