首页 > 解决方案 > 领域以有效的方式删除孤立对象

问题描述

我有一个包含 BeaconData 列表的 BeaconBase 类。

public class BeaconBase extends RealmObject {

    @PrimaryKey
    private Integer checkInID;

    @SerializedName("beacons")
    @Expose
    private RealmList<BeaconData> beacons;
}

public class BeaconData extends RealmObject {

    @SerializedName("scanId")
    @Expose
    private String scanId;

    @SerializedName("distance")
    @Expose
    private String distance;

}

BeaconData 通常会很大。可能是每小时大约 100000 行。当我删除相关的 BeaconBase 记录时,如何有效地删除 BeaconData?

我只有在 BeaconBase 中有主键。

所以当我删除 BeaconBase 记录时,成千上万的 BeaconData 记录被孤立了。我怎样才能有效地处理这种情况?

标签: androiddatabaserealmrealm-mobile-platformrealm-list

解决方案


try(Realm r = Realm.getDefaultInstance)) {
    r.executeTransaction((realm) -> {
        RealmResults<BeaconBase> beaconsToDelete = realm.where(BeaconBase.class)./*query here*/.findAll();
        for(int i = beaconsToDelete.size() - 1; i >= 0; i--) {
            BeaconBase beaconBase = beaconsToDelete.get(i);
            beaconBase.getBeacons().deleteAllFromRealm();
            beaconBase.deleteFromRealm();
        }
    });
}

尽管要稍微多一些用处,但您也可以这样做:

public class BeaconBase extends RealmObject {

    @PrimaryKey
    private Integer checkInID;

    @SerializedName("beacons")
    @Expose
    private RealmList<BeaconData> beacons;
}

public class BeaconData extends RealmObject {

    @SerializedName("scanId")
    @Expose
    private String scanId;

    @SerializedName("distance")
    @Expose
    private String distance;

    @LinkingObjects("beacons")
    private final RealmResults<BeaconBase> beaconDataOf = null;
}

try(Realm r = Realm.getDefaultInstance)) {
    r.executeTransaction((realm) -> {
        realm.where(BeaconBase.class)./*query here*/.findAll().deleteAllFromRealm();
        realm.where(BeaconData.class).isEmpty("beaconDataOf").findAll().deleteAllFromRealm();
    });
}

推荐阅读