Skip to content

Cascade delete complex objects: Nested objects with and without @PrimaryKey #6217

@alexei-28

Description

@alexei-28

Realm ver. 4.1.0

In my Android application I use Realm. In Realm I has Merchant objects. I need to delete ALL of them.
The Merchant is a complex object that contain nested objects with and WITHOUT @PrimaryKey.

Here code:

public class Merchant extends RealmObject {
    @PrimaryKey
    private long id;
    private LocalizedString name;
    private Category category;
    private Image preview;
    private RealmList<Product> products = new RealmList<>();
    private boolean favorite;


  public void cascadeDelete() {
        name.cascadeDelete();
        if (category != null) {
            category.cascadeDelete();
        }
        if (preview != null) {
            preview.cascadeDelete();
        }
        for (int index = products.size() - 1; index >= 0; index--) {
            Product product = products.get(index);
            product.cascadeDelete();
        }
           deleteFromRealm(); // delete this object
	}
}

Here nested objects:
public class LocalizedString extends RealmObject {
    private RealmList<TranslatedString> translations = new RealmList<>();

    public void cascadeDelete() {
        for (int index = translations.size() - 1; index >= 0; index--) {
            TranslatedString currentTranslatedString = translations.get(index);
            currentTranslatedString.deleteFromRealm();
        }
            deleteFromRealm(); // delete this object
	}
}
	

 public class TranslatedString extends RealmObject {
    private String locale;
    private String value;
  }



public class Category extends RealmObject {
    @PrimaryKey
    private long id;
    private LocalizedString name;
    private Image image;
    private Date createdAt = new Date();

    public void cascadeDelete() {
        name.cascadeDelete();
        if (image != null) {
            image.cascadeDelete();
        }
          deleteFromRealm(); // delete this object
      }
}
	

public class Image extends RealmObject {
    @PrimaryKey
    private long id;
    private ImageFormats formats;
    private Date updatedAt = new Date();

    public void cascadeDelete() {
        formats.cascadeDelete();
        deleteFromRealm(); // delete this object
    }
}


public class ImageFormats extends RealmObject {
    private ImageSource reference;
    private ImageSource average;

    public void cascadeDelete() {
        if (reference != null) {
            reference.deleteFromRealm();
        }
        if (average!= null) {
            average.deleteFromRealm();
        }
        deleteFromRealm(); // delete this object
	}
}


public class ImageSource extends RealmObject {
    private int width;
    private int height;
}


public class Product extends RealmObject {
    @PrimaryKey
    private long id;
    private LocalizedString name;
    private Image preview;
    private float price;

    public void cascadeDelete() {
        name.cascadeDelete();
        if (preview!= null) {
            preview.cascadeDelete();
        }
          deleteFromRealm(); // delete this object
   }
}

And here code that call delete of ALL merchants:

public static void updateMerchants(final List<Merchant> incomingMerchantsList) {
       Realm realm = Realm.getDefaultInstance();
       try {
           realm.executeTransaction(new Realm.Transaction() {
               @Override
               public void execute(Realm realm) {
                   RealmResults<Merchant> localMerchantList = getMerchants(realm, new Bundle(), null);
                    for (Merchant localMerchant : localMerchantList) {
                        localMerchant.cascadeDelete();
                   }
                   localMerchantList.deleteAllFromRealm();
               }
           });
       } finally {
           realm.close();
       }
}

As you can see I delete nested objects by use custom method cascadeDelete()

Questions:

  1. Is it correct approach? Is I MUST call cascadeDelete() to delete nested objects?
  2. I think it too much code. Has any solution with less code?

Thanks.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions