-
Notifications
You must be signed in to change notification settings - Fork 1.8k
Closed
Labels
Description
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:
- Is it correct approach? Is I MUST call
cascadeDelete()
to delete nested objects? - I think it too much code. Has any solution with less code?
Thanks.