领域崩溃项目已删除。但我首先重新查询领域

Realm crashes item deleted. But I do requery Realm first

我收到回复,我这样做了:

 if (jsonObject != null && jsonObject.has("results")) {
                try {
                    final JSONArray array = jsonObject.getJSONArray("results");
                    Realm realm = Realm.getInstance(PSApplicationClass.Config);
                    realm.executeTransaction(new Realm.Transaction() {
                        @Override
                        public void execute(Realm realm) {
                            try {
                                realm.delete(Beacon.class);
                                realm.createOrUpdateAllFromJson(Beacon.class, array);
                            } catch (Exception e) {
                                Log.e("", "error is: " + e.getMessage());
                            }
                            if (back != null)
                                back.onResponse("");
                        }
                    });
                    realm.close();
                } catch (Exception e) {
                    Log.e("", "error trying to fetch user beacons: " + e.getMessage());
                    if (back != null)
                        back.onResponse("");
                }
            }

这是我的 Beacon.java 模型 class。 之后,在我的 Activity 中,我这样做:

 public void setBeaconsInList() {
    Realm realm = Realm.getInstance(PSApplicationClass.Config);
    RealmResults<Beacon> beaconsResults = realm.where(Beacon.class).findAll();
    if (beaconsResults != null && beaconsResults.size() > 0) {
        for (Beacon beacon : beaconsResults) {
             for (Beacon beacon : beaconsResults) {
                if (!beacons.contains(beacon)) {
                    if (beacon.getUser_vehicle() != null) {
                        beacons.add(0, beacon);
                        userBeaconAdapter.addItemFirst(beacon);
                    } else {
                        beacons.add(beacon);
                        userBeaconAdapter.addItem(beacon);
                    }
                }
            }
        }
    }
    userBeaconAdapter.notifyDataSetChanged();
    realm.close();
}

我收到这个错误:

10-16 17:39:09.527: E/AndroidRuntime(27720): java.lang.IllegalStateException: Object is no longer valid to operate on. Was it deleted by another thread?
10-16 17:39:09.527: E/AndroidRuntime(27720):    at io.realm.internal.UncheckedRow.nativeGetIndex(Native Method)
10-16 17:39:09.527: E/AndroidRuntime(27720):    at io.realm.internal.UncheckedRow.getIndex(UncheckedRow.java:137)
10-16 17:39:09.527: E/AndroidRuntime(27720):    at io.realm.BeaconRealmProxy.equals(BeaconRealmProxy.java:851)
10-16 17:39:09.527: E/AndroidRuntime(27720):    at java.util.ArrayList.contains(ArrayList.java:339)
10-16 17:39:09.527: E/AndroidRuntime(27720):    at nl.hgrams.passenger.activities.PSUserBeaconsActivity.setBeaconsInList(PSUserBeaconsActivity.java:144)
10-16 17:39:09.527: E/AndroidRuntime(27720):    at nl.hgrams.passenger.activities.PSUserBeaconsActivity.onResponse(PSUserBeaconsActivity.java:126)
10-16 17:39:09.527: E/AndroidRuntime(27720):    at nl.hgrams.passenger.model.vehicle.Beacon.onResponse(Beacon.java:117)
10-16 17:39:09.527: E/AndroidRuntime(27720):    at nl.hgrams.passenger.utils.WSCalls.onResponse(WSCalls.java:98)
10-16 17:39:09.527: E/AndroidRuntime(27720):    at nl.hgrams.passenger.utils.WSCalls.onResponse(WSCalls.java:77)
10-16 17:39:09.527: E/AndroidRuntime(27720):    at com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:90)
10-16 17:39:09.527: E/AndroidRuntime(27720):    at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:102)
10-16 17:39:09.527: E/AndroidRuntime(27720):    at android.os.Handler.handleCallback(Handler.java:739)
10-16 17:39:09.527: E/AndroidRuntime(27720):    at android.os.Handler.dispatchMessage(Handler.java:95)
10-16 17:39:09.527: E/AndroidRuntime(27720):    at android.os.Looper.loop(Looper.java:148)
10-16 17:39:09.527: E/AndroidRuntime(27720):    at android.app.ActivityThread.main(ActivityThread.java:5417)
10-16 17:39:09.527: E/AndroidRuntime(27720):    at java.lang.reflect.Method.invoke(Native Method)
10-16 17:39:09.527: E/AndroidRuntime(27720):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
10-16 17:39:09.527: E/AndroidRuntime(27720):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

为什么会这样?如果我重新创建我的领域实例并重新查询,为什么它 return 对象被删除了? 我只想显示剩余的对象。

如果没有,是否有不同的方法来检查和删除未从服务器更新的对象?

感谢奥兰多的评论,我明白了。我的列表正在与我的适配器中的对象进行比较,并且由于我的更改,适配器中的对象已经过时了。这就是我的逻辑出错的地方。并不是新查询过时了,而是我没有清除适配器。 所以在修复之前这样做:

  beacons.clear();
  userBeaconAdapter.clearItems();