【问题标题】:Realm Delete Orphaned Objects in an Efficient Way领域以有效的方式删除孤立对象
【发布时间】:2019-11-27 13:13:17
【问题描述】:

我有一个 BeaconBase 类,其中包含 BeaconData 列表。

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 记录被孤立。我怎样才能有效地处理这种情况?

【问题讨论】:

    标签: android database realm realm-mobile-platform realm-list


    【解决方案1】:
    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();
        });
    }
    

    【讨论】:

    • 在您提到的第一种方式中,beaconBase.getBeacons().deleteAllFromRealm();但是在我们无法从 deleteAllFromRealm 执行的信标列表中,对吧?
    • 如果是这样,您可以将其替换为getBeacons().where().findAll().deleteAllFromRealm();
    • 感谢您的回复。我实际上是在考虑在 BeaconData 中有一个主键,它不会通过级联删除来解决我的问题吗?
    • 您仍然需要以与选项 #2 相同的方式删除信标数据
    • 感谢您的回复。我遵循了方法#2。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    相关资源
    最近更新 更多