Pourquoi je me ArrayIndexOutOfBoundsException lorsque vous essayez de supprimer des objets dans Realm?

voix
0

Il y a un tel cas, je dois supprimer tous les objets de royaume et laisser seulement 10 dernière.

Il est ma méthode

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);
                }
            }
        });
    }
}

et il y a erreur que je reçois

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)

Mais si je tente de supprimer mes objets de telle manière

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();

                }
            }
        });
    }
}

tout fonctionne bien. Mais je dois utiliser la première approche listToInvalidate.deleteFromRealm(i);, donc

Qu'est-ce que je fais mal?

Créé 01/03/2017 à 14:46
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
1

Je suppose que lorsque vous supprimez de la liste que vous Boucler dans, la taille de cette liste se rétrécit à chaque itération. Ainsi, votre boucle devient rapidement à un point où l'indice est en dehors des limites. (John C fait un excellent travail d'expliquer cela dans sa réponse)

En ce qui concerne une solution, je suggère une boucle à travers et « marquage » des entrées pour infirmation, et passe ensuite à travers et enlever les éléments marqués. De cette façon, vous ne devez pas compter sur l'indice (qui change comme vous invalidez articles).

Permettez-moi de savoir si cela a un sens, et je vais essayer de clarifier ce que je veux dire si elle ne fonctionne pas.

Créé 01/03/2017 à 15:11
source utilisateur

voix
3

RealmResults.deleteFromRealm () « supprime également de la collection. » Donc , vous supprimez 0, puis les 1 quarts de travail d' origine dans 0, alors vous supprimer l' index 1 avec le incrémentée i. Essayons avec une liste de taille 8 et garder 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

Ce que vous pouvez faire est de supprimer l'index 0 à chaque fois. Votre deuxième échantillon ne supprime pas de la collection RealmResults afin que vous n'avez pas ce problème.

Créé 01/03/2017 à 15:12
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more