Alexei
Alexei

Reputation: 15646

deleteAllFromRealm(RealmList : This method is only available in managed mode

Android Studio 3.2. , Realm 4.1.0

I need to delete all items in list from Realm.

My snippet:

    public static RealmList<Merchant> getMerchantsRealmList() {
        Realm realm = Realm.getDefaultInstance();
        try {
            RealmResults<Merchant> realmResults = realm.where(Merchant.class).findAll();
            RealmList<Merchant> realmList = new RealmList<>();
            realmList.addAll(realmResults.subList(0, realmResults.size()));
            return realmList;
        } finally {
            realm.close();
        }
    }

 public static void updateMerchantList(final List<Merchant> thatMerchantsList) {
        Realm realm = Realm.getDefaultInstance();
        try {
            realm.executeTransaction(new Realm.Transaction() {
                @Override
                public void execute(Realm realm) {
                    RealmList<Merchant> localMerchantRealmList = getMerchantsRealmList();
                    if (!EqualsUtil.areEqualContentLists(localMerchantRealmList, thatMerchantsList)) {
                        List<Merchant> itemNotExistInThatMerchants = new ArrayList<>(localMerchantRealmList);
                        itemNotExistInThatMerchants.removeAll(thatMerchantsList);
                        if (itemNotExistInThatMerchants.size() > 0) {
                            localMerchantRealmList.removeAll(itemNotExistInThatMerchants);
                            localMerchantRealmList.deleteAllFromRealm(); // error here
                        }
                    }

                }
            });
        } finally {
            realm.close();
            Debug.d(TAG, "updateMerchantList: finish");
        }
    }

But on runtime I get error in this line :

localMerchantRealmList.deleteAllFromRealm();

Here error:

java.lang.UnsupportedOperationException: This method is only available in managed mode.
    at io.realm.RealmList.deleteAllFromRealm(RealmList.java:660)
    at com.myproject.customer.service.MerchantService$1.execute(MerchantService.java:107)
    at io.realm.Realm.executeTransaction(Realm.java:1393)
    at com.myproject.customer.service.MerchantService.updateMerchantList(MerchantService.java:70)
    at com.myproject.customer.service.SyncService$1.onSuccess(SyncService.java:49)
    at com.myproject.customer.api.DefaultRestClientCallback.onResponse(DefaultRestClientCallback.java:31)
    at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:70)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5417)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

Upvotes: 0

Views: 400

Answers (1)

Siyu
Siyu

Reputation: 12079

When you convert RealmResults to RealmList with

RealmList<Merchant> realmList = new RealmList<>();
realmList.addAll(realmResults.subList(0, realmResults.size()));

you created an unmanaged version of your data, meaning the objects in the list are not connected to the database anymore and are basically normal Java objects.

You will have to keep a reference of RealmResults and delete from it.

Upvotes: 2

Related Questions