java - 为什么我在尝试删除 Realm 中的对象时收到 ArrayIndexOutOfBoundsException?

标签 java android realm

有这样的情况,我需要从 Realm 中删除所有对象,只保留最后 10 个。

这是我的方法

private void invalidate() {
    final int AVAILABLE_SIZE = 10;
    final RealmResults<CardMainActivity> listToInvalidate = realmDB.where(CardMainActivity.class).findAll();
    final int sizeOfList = listToInvalidate.size();

    if (sizeOfList > AVAILABLE_SIZE) {
        realmDB.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                for (int i = 0; i < sizeOfList - AVAILABLE_SIZE; i++) {
                    listToInvalidate.deleteFromRealm(i);
                }
            }
        });
    }
}

我收到错误

FATAL EXCEPTION: main
                                                                         Process: com.fittingroom.newtimezone, PID: 2438
                                                                         java.lang.RuntimeException: Unable to start activity ComponentInfo{com.fittingroom.newtimezone/com.fittingroom.newtimezone.view. activityMainNew.ActivityMainnew}: java.lang.ArrayIndexOutOfBoundsException:  rowIndex > available rows: 12 > 12
                                                                              at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3253)
                                                                           at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349)
                                                                           at android.app.ActivityThread.access$1100(ActivityThread.java:221)
                                                                           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
                                                                           at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                           at android.os.Looper.loop(Looper.java:158)
                                                                           at android.app.ActivityThread.main(ActivityThread.java:7224)
                                                                           at java.lang.reflect.Method.invoke(Native Method)
                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
                                                                        Caused by: java.lang.ArrayIndexOutOfBoundsException: rowIndex > available rows: 12 > 12
                                                                           at io.realm.internal.TableView.nativeRemoveRow(Native Method)
                                                                           at io.realm.internal.TableView.remove(TableView.java:410)
                                                                           at io.realm.RealmResults.deleteFromRealm(RealmResults.java:295)
                                                                           at com.fittingroom.newtimezone.tools.realmdb.RealmDB$1.execute(RealmDB.java:49)
                                                                           at io.realm.Realm.executeTransaction(Realm.java:1304)
                                                                           at com.fittingroom.newtimezone.tools.realmdb.RealmDB.invalidate(RealmDB.java:43)
                                                                           at com.fittingroom.newtimezone.tools.realmdb.RealmDB.<init>(RealmDB.java:23)
                                                                           at com.fittingroom.newtimezone.tools.realmdb.RealmDB.getInstance(RealmDB.java:28)
                                                                           at com.fittingroom.newtimezone.view.activityMainNew.ControllerActivityMainnew.isDBContainsData(ControllerActivityMainnew.java:55)

但是如果我尝试以这种方式删除我的对象

private void invalidate() {
    final int AVAILABLE_SIZE = 10;
    final RealmResults<CardMainActivity> listToInvalidate = realmDB.where(CardMainActivity.class).findAll();
    final int sizeOfList = listToInvalidate.size();

    if (sizeOfList > AVAILABLE_SIZE) {
        realmDB.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                for (int i = 0; i < sizeOfList - AVAILABLE_SIZE; i++) {
                    CardMainActivity card = listToInvalidate.get(i);
                    card.deleteFromRealm();

                }
            }
        });
    }
}

一切都很好。但我需要使用第一种方法 listToInvalidate.deleteFromRealm(i);,所以

我做错了什么?

最佳答案

RealmResults.deleteFromRealm() “也将其从集合中删除。”所以你要删除 0,然后原来的 1 变成 0,然后你用增加的 i 删除索引 1。让我们尝试使用大小为 8 并保留 3 的列表:

 0 1 2 3 4 5 6 7, delete i = 0, continue if i < 8-3
 1 2 3 4 5 6 7, delete i = 1, continue if i < 8-3 
 1 3 4 5 6 7, delete i = 2, continue if i < 8-3
 1 3 5 6 7, delete i = 3, continue if i < 8-3
 1 3 5 7, delete i = 4, Exception, there is no element 4

你可以做的就是每次删除索引 0。您的第二个示例不会将其从 RealmResults 集合中删除,因此您不会遇到此问题。

关于java - 为什么我在尝试删除 Realm 中的对象时收到 ArrayIndexOutOfBoundsException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42537375/

相关文章:

javascript - 动态设置 list 时的 PWA 安装提示

android - 在android中获取设备id

java - Realm.io 使用 GroupBy 查询

ios - 如何在使用 Realm 的同时实现 Codable

java - 如何在 Android 中对 Activity 强制执行自定义权限?

java - 如何在 android Sybase Unwired Platform 中获取大型 JSON 响应

java - Android AutoCompleteTextView 弹出窗口在显示后移动

database - 用于移动开发的 Realm 与 Sqlite

java - hibernate 更新后出现 AbstractMethodError

Java:如何保持循环来修复异常?