2014-10-10 8 views
5

Ich benutze Ormlite in Android und hat Tabellen erfolgreich erstellt und führen Sie die verschiedenen Operationen mit DAO.Wie kaskadierende Löschung auf Fremdschlüssel mit ormlite in Android

Aber ich habe beim Löschen der Fremdschlüssel Zeile stecken, wenn Primärschlüssel aus der Haupttabelle gelöscht wird.

Ich habe zwei Tabellen mit dem Namen Eltern und Kind. Ein Elternteil hat mehr als ein Kind, also habe ich das Kind mit Fremdschlüssel verbunden.

Code:
Geordnete Tabelle:

@DatabaseField(id = true) 
private Integer id; 

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

Child Table:

@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; 

Wenn ich nun für eine bestimmte ID Eltemzeile am Löschen dann wird diese nicht zu löschen die Kinder vom Kindertisch.

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

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

Bitte führen Sie mich, wo ich falsch mache. Ich habe es oft versucht und Google aber kein Glück.

Antwort

2

Wahrscheinlich haben Sie bereits eine Lösung gefunden, aber jemand könnte dies benötigen. nach BaseForeignCollection Quellcode kann die Lösung folgende sein:

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

Eigentlich kann man Ihre eigene dao für Eltern implementieren und löschen Methode wie folgt außer Kraft setzen:

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

Wahrscheinlich würde in einem solchen genug sein, Fälle.

1

Sie sollten constraint verwenden, wie:

@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. Ich weiß, es ist tot nach dem Altern 3 Jahre :)

+0

StackOverflow ist kein Forum, neue Antworten sind willkommen :) – m0skit0