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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions