2014-10-10 16 views
5

Sto usando ormlite in Android e ho creato tabelle con successo ed eseguo le diverse operazioni usando DAO.Come eseguire la cancellazione a cascata su chiave esterna utilizzando ormlite in Android

Ma mi sono bloccato nell'eliminare la riga delle chiavi esterne se la chiave primaria è stata cancellata dalla tabella principale.

Ho due tabelle denominate padre e figlio. Un genitore ha più di un figlio quindi ho collegato il bambino con una chiave esterna.

Codice:
tabella principale:

@DatabaseField(id = true) 
private Integer id; 

@ForeignCollectionField(eager = false) 
private ForeignCollection<Child> childCollection; 

Tabella Bambini:

@DatabaseField(id = true) 
private Integer id; 

@DatabaseField(foreign = true, foreignAutoRefresh = true, canBeNull = false, 
    index = true, columnDefinition = "INTEGER REFERENCES parent(id) ON DELETE CASCADE") 
private Parent parent; 

Ora, se io sto eliminando riga padre per un particolare id allora questo non è l'eliminazione i bambini dal tavolo del bambino.

public void deleteById(Integer parentId) { 
    try { 
     Dao<Parent, Integer> parentDao = databaseHelper.getParentDao(); 
     parentDao .deleteById(parentId); 

    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
} 

Per favore guidami, dove sto sbagliando. Ho provato e Google molte volte ma senza fortuna.

risposta

2

Probabilmente avete già trovato una soluzione, ma qualcuno potrebbe aver bisogno di questo. secondo il BaseForeignCollection codice sorgente La soluzione potrebbe essere la seguente:

parent.getChildren().clear(); 
Dao<Parent, Integer> parentDao = databaseHelper.getParentDao(); 
parentDao.delete(parent); 

In realtà, è possibile implementare il proprio dao per il genitore e sovrascrivere metodo delete come questo:

@Override 
public int delete(final Parent data) throws SQLException { 
    data.getChildren().clear(); 
    return super.delete(data); 
} 

Probabilmente, sarebbe sufficiente in tale casi.

1

Si dovrebbe usare constraint, come:

@DatabaseField ( 
    foreign = true, 
    foreignAutoRefresh = true, 
    canBeNull = false, 
    index = true, 
    columnDefinition = "INTEGER CONSTRAINT FK_NAME REFERENCES parent(id) ON DELETE CASCADE" 
) 
private Parent parent; 

P.S. So che è morto post invecchiamento 3 anni :)

+0

StackOverflow non è un forum, nuove risposte sono i benvenuti :) – m0skit0