2 votes

Suppression d'objets de domaine faisant partie d'autres objets de domaine

J'ai commencé à essayer Realm pour Android, et j'ai donc créé deux classes :

class ProductSelection extends RealmObject {

private String selectedProductName;
private String selectedProductID;
…
}

class ProductProfile extends RealmObject {

private String profileTitle;   
private RealmList< ProductSelection > productSelection;
…
}

J'ai ensuite créé quelques objets ProductSelection et ProductProfile.

  realm.beginTransaction();
    ProductSelection prodSelection = realm.createObject(ProductSelection.class);
    prodSelection.setSelectedProductName(prodTv.getText().toString());
    prodSelection.setSelectedProductID(prodIdTv.getText().toString());
    …
    realm.commitTransaction();
    …
    realm.beginTransaction();

    ProductProfile profile = realm.createObject(ProductProfile.class);
    profile.setProfileTitle(“Some Title”);

    RealmResults< ProductSelection > results =         
    realm.allObjects(ProductSelection.class);
    RealmList< ProductSelection > selectionList = new RealmList<>();
    for (ProductSelection selection : results) {
    selectionList.add(selection);
    } 
    profile.setProductSelection(selectionList);

realm.commitTransaction();

J'ai maintenant les questions suivantes :

  1. Lorsque j'appelle

    realm.allObjects(ProductSelection.class).clear(); 

il semble que non seulement mes objets ProductSelection soient effacés, mais aussi la liste des objets ProductSelection qui font partie de la classe ProductProfile, car ils ne contiennent plus d'objets. Est-il possible d'empêcher cela, c'est-à-dire de supprimer tous les objets ProductSelection mais de conserver les objets qui font partie de la liste ProductProfile ?

  1. L'autre solution est-elle également possible, c'est-à-dire supprimer les objets ProductProfile sans supprimer les objets ProductSelection qui ne font pas partie de la liste ProductSelection ?

0voto

ChristianMelchior Points 494

Non, il n'y en a pas. Realm est une base de données typée, vous pouvez donc considérer une classe RealmObject comme une table SQLite. L'effacement de cette table supprimera toutes les données, même si elles sont référencées par d'autres classes.

La solution serait d'effectuer une requête pour le fichier ProductSelection et les supprimer explicitement :

realm.executeTransaction(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {
        realm.where(ProductSelection.class).equalTo("someField", "someValue")
                               .findAll()
                               .deleteAllFromRealm(); 
        // deleteAllFromRealm() since 0.89.0, in previous versions it's `clear()`
    }
});

0voto

Zhuinden Points 3074

En fait, je n'arrive pas à penser à un simple pour prendre en charge ce cas d'utilisation explicite, à moins que vous n'utilisiez un mappage bidirectionnel (si votre ProductProfile contient un ProductSelection , alors que ProductSelection contient également son ProductProfile ).

Parce qu'alors vous pouvez faire ceci

realm.where(ProductSelection.class).isEmpty("productProfileList").findAll().deleteAllFromRealm();
// clear before 0.89.0, deleteAllFromRealm() after 0.89.0+

Vous devez cependant gérer vous-même cette cartographie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X