Android 域以有效的方式删除孤立对象
我有一个包含BeaconData列表的类BeaconBaseAndroid 域以有效的方式删除孤立对象,android,database,realm,realm-mobile-platform,realm-list,Android,Database,Realm,Realm Mobile Platform,Realm List,我有一个包含BeaconData列表的类BeaconBase public class BeaconBase extends RealmObject { @PrimaryKey private Integer checkInID; @SerializedName("beacons") @Expose private RealmList<BeaconData> beacons; } public class BeaconData exten
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;
}
公共类BeaconBase扩展RealmObject{
@主键
私有整数校验ID;
@序列化名称(“信标”)
@暴露
私人RealmList信标;
}
公共类BeaconData扩展RealmObject{
@SerializedName(“scanId”)
@暴露
私有字符串scanId;
@序列化名称(“距离”)
@暴露
私有字符串距离;
}
海狸通常是巨大的。大约每小时100000行。当我删除相关的BeaconBase记录时,如何有效地删除BeaconData
我只有BeaconBase中的主键
因此,当我删除BeaconBase记录时,数千条BeaconData记录被孤立。如何有效地处理这种情况?try(realmr=Realm.getDefaultInstance)){
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();
}
});
}
r、 executeTransaction((领域)->{
RealmResults beaconstodelet=realm.where(BeaconBase.class)。/*在此处查询*/.findAll();
对于(int i=beacostoDelete.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扩展RealmObject{
@主键
私有整数校验ID;
@序列化名称(“信标”)
@暴露
私人RealmList信标;
}
公共类BeaconData扩展RealmObject{
@SerializedName(“scanId”)
@暴露
私有字符串scanId;
@序列化名称(“距离”)
@暴露
私有字符串距离;
@链接对象(“信标”)
private final RealmResults beaconDataOf=null;
}
try(realmr=Realm.getDefaultInstance)){
r、 executeTransaction((领域)->{
realm.where(BeaconBase.class)。/*在此处查询*/.findAll().deleteAllFromRealm();
realm.where(BeaconData.class).isEmpty(“beaconDataOf”).findAll().deleteAllFromRealm();
});
}
在您提到beaconBase.getBeacons()的第一种方式中,deleteAllFromRealm();但是在信标列表上,我们不能执行deleteAllFromRealm,对吗?如果这是真的,您可以用getBeacons().where().findAll().deleteAllFromRealm()替换它代码>谢谢你的回复。实际上,我正在考虑在BeaconData中使用主键,它是否可以通过级联删除来解决我的问题?您仍然需要以与选项#2tanks相同的方式删除信标数据以获得回复。我遵循了方法2。