2016-06-03 15 views
1

Ich habe zwei Klassen, Trip und TravelStamp. Reisen haben viele TravelStamps und TravelStamps haben viele Reisen.Remove item from Realm viele zu viele Beziehungen

Sie sind so deklariert.

public class Travelstamp extends RealmObject{ 
@PrimaryKey 
private int id; 
private Date timestamp; 
private double lat; 
private double lon; 
private boolean sync; 
private Date syncDate; 
// getters and setters // 
... 
} 


public class Trip extends RealmObject { 

@PrimaryKey 
private String id; 
private String name; 
private Date start; 
private Date end; 
private RealmList<TravelStamp> stamps; 
//getters and setters 
... 
} 

Was ich tun möchte, ist eine Reise aus dem Reich zu entfernen. Ich möchte auch jeden TravelStamp entfernen, der mit dieser Reise verbunden ist, unter der Bedingung, dass der TravelStamp nicht mit anderen Reisen verbunden ist. Wie kann ich herausfinden, welche Trips mit einem einzelnen TravelStamp-Objekt verknüpft sind?

Antwort

3

Was Sie suchen, ist kaskadierende Löschungen. Es ist noch nicht in Realm umgesetzt, aber es ist ein Problem für sie hier, mit einigen möglichen Abhilfen: https://github.com/realm/realm-java/issues/2717

Eine einfache Möglichkeit ist, Ihre eigene Löschverfahren implementiert, die wie folgt aussehen könnte:

public class Trip extends RealmObject { 
    public RealmList<TravelStamp> stamps; 
    ... 

    public void cascadeDelete(Realm realm) { 
    List<TravelStamp> stampsToDelete = new ArrayList<>(); 
    for (TravelStamp stamp : stamp) { 
     if (realm.where(Travel.class).equalTo("stamps.id", stamp.getId()).count() == 1) { 
     stampsToDelete.add(stamp); 
     } 
    } 
    for (TravelStamp stamp : stampsToDelete) { 
     stamp.deleteFromRealm(); 
    } 
    deleteFromRealm(); // delete this object 
    } 
} 
+0

Dies überprüft nicht, ob einige der Stempel mit anderen Reisen verbunden sind, obwohl –

+0

Ihr Recht. Ich habe diesen Teil vermisst. Dieser Teil ist viel schwieriger. Es wird durch https://github.com/realm/realm-java/pull/2881 gelöst werden, aber das ist gerade nicht besonders hilfreich. Für den Moment könnten Sie eine zusätzliche Abfrage in der cascadeDelete() -Methode erstellen. –

Verwandte Themen