realm-java: Cannot delete an Realm object

#model `@RealmClass public class sample implements RealmModel, IPrimaryKey{}

public interface IPrimaryKey { String getPrimaryKey();

void setPrimaryKey(String key);

}`

Goal

I was creating a library to combine realm and firebase . I want to delete an object from realm. `final T result = realm.where(modelClass) .equalTo(primaryKey, dataSnapshot.getKey()) .findFirst();

        if (RealmObject.isValid(result)) {
            realm.executeTransaction(new Realm.Transaction() {
                @Override
                public void execute(Realm realm) {
                    RealmObject.deleteFromRealm(result);
                }
            });
        }`

Expected Results

The object should have been deleted.

?

Actual Results

Instead i get FATAL EXCEPTION: main Process: com.spar.chillout, PID: 3592 Theme: themes:{com.android.dialer=overlay:org.cyanogenmod.hexolibre, default=overlay:system, iconPack:system, fontPkg:system, com.android.systemui=overlay:system, com.android.systemui.navbar=overlay:system} java.lang.IllegalArgumentException: Object not managed by Realm, so it cannot be removed. at io.realm.RealmObject.deleteFromRealm(RealmObject.java:97) at com.spar.chillout.firebase.RealmFirebaseArray$3.execute(RealmFirebaseArray.java:85) at io.realm.Realm.executeTransaction(Realm.java:1255) at com.spar.chillout.firebase.RealmFirebaseArray.onChildRemoved(RealmFirebaseArray.java:82) at com.google.android.gms.internal.zzajg.zza(Unknown Source) at com.google.android.gms.internal.zzalg.zzcxk(Unknown Source) at com.google.android.gms.internal.zzalj$1.run(Unknown Source) 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:5461) 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)

Version of Realm and tooling

Realm version(s): 2.1.1

Realm sync feature enabled: no

Android Studio version: android 2.3.3 Android gradle 2.2.2

Android version Marshmallow

About this issue

  • Original URL
  • State: closed
  • Created 8 years ago
  • Comments: 22 (10 by maintainers)

Most upvoted comments

As a workaround i have changed the query to `@Override public void onChildRemoved(DataSnapshot dataSnapshot) { final T t = dataSnapshot.getValue(modelClass);

    if (t != null) {
        // temp workaround
        final RealmResults<T> results = realm.where(modelClass)
                .equalTo(primaryKey, dataSnapshot.getKey())
                .findAll();

        if (results.isValid()) {
            realm.executeTransaction(new Realm.Transaction() {
                @Override
                public void execute(Realm realm) {
                    results.deleteAllFromRealm();
                    Log.d(TAG, "execute: items deleted");
                }
            });
        }
    }`

Now it works ! Because the RealmResults have a primary key , it doesn’t matter if i use results or a single result. But i don’t know why single query returned an unmanaged object.

You’re deleting an unmanaged object, and not a managed RealmObject.