【问题标题】:Exception has been throw: rowIndex > available rows: 2 > 1抛出异常:rowIndex > 可用行:2 > 1
【发布时间】:2016-11-07 16:59:18
【问题描述】:

我实际上是在使用 Realm 做一个应用程序,但遇到了一些麻烦。

我在我的活动中加载一个列表,其中一些信息存储在我的 Realm DB 中,它在列表中的 2 个元素上工作得很好,但是当我添加第三个元素并尝试加载活动时,抛出此异常

11-07 16

:54:28.829 11829-11829/com.list.buffet.alvaro.buffetlist E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.list.buffet.alvaro.buffetlist/com.list.buffet.alvaro.buffetlist.SavedListActivity}: java.lang.ArrayIndexOutOfBoundsException: rowIndex > available rows: 2 > 1
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2351)
    at android.app.ActivityThread.handleLauchActivity(ActivityThread.java:2403)
    at android.app.ActivityThread.access$600(ActivityThread.java:165)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1373)
    at android.os.Handler.dispatchMessage(Handler.java:107)
    at android.os.Looper.loop(Looper.java:194)
    at android.app.ActivityThread.main(ActivityThread.java:5391)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:525)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
    at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.ArrayIndexOutOfBoundsException: rowIndex > available rows: 2 > 1
    at io.realm.internal.TableView.nativeGetSourceRowIndex(Native Method)
    at io.realm.internal.TableView.getSourceRowIndex(TableView.java:111)
    at io.realm.RealmResults.get(RealmResults.java:215)
    at com.list.buffet.alvaro.buffetlist.SavedListActivity.saveListInMap(SavedListActivity.java:166)
    at com.list.buffet.alvaro.buffetlist.SavedListActivity.addElementsToList(SavedListActivity.java:156)
    at com.list.buffet.alvaro.buffetlist.SavedListActivity.onCreate(SavedListActivity.java:43)
    at android.app.Activity.performCreate(Activity.java:5122)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1150)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2315)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2403) 
    at android.app.ActivityThread.access$600(ActivityThread.java:165) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1373) 
    at android.os.Handler.dispatchMessage(Handler.java:107) 
    at android.os.Looper.loop(Looper.java:194) 
    at android.app.ActivityThread.main(ActivityThread.java:5391) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:525) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 
    at dalvik.sys

抛出这个异常的方法是:

private void saveListInMap() {
    for (int i = 0; i < listItems.size(); i++) {
        SavedList savedList = new SavedList();
        RealmResults<FoodList> queryListName = realm.where(FoodList.class)
                .equalTo("listName", listItems.get(i))
                .findAll();
        savedList.setListName(queryListName.get(i).getListName());
        savedList.setRestaurantName(queryListName.get(i).getRestaurantName());
        addElementsToList(savedList, queryListName);
        plateMap.put(i,savedList);
    }
}

private void addElementsToList(SavedList savedList, RealmResults<FoodList> queryListName) {
    for (int j = 0; j < queryListName.size(); j++) {
        savedList.addToList(queryListName.get(j).getFoodPlate());
    }
}

我的领域对象:

public class FoodList extends RealmObject {
    private int id;
    private String foodPlate;
    private String listName;
    private String restaurantName;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getFoodPlate() {
        return foodPlate;
    }

    public void setFoodPlate(String foodPlate) {
        this.foodPlate = foodPlate;
    }

    public String getListName() {
        return listName;
    }

    public void setListName(String listName) {
        this.listName = listName;
    }

    public String getRestaurantName() {
        return restaurantName;
    }

    public void setRestaurantName(String restaurantName) {
        this.restaurantName = restaurantName;
    }
}

我不知道会是什么,我有点沮丧。

【问题讨论】:

  • 你使用的是什么版本的 Realm?
  • 顺便说一句,这是因为您在 listItems 中有 2 个项目,而您的 RealmResults 中有 1 个项目 - 但如果您直接使用 RealmResults,那么只要您注册一个 RealmChangeListener 到处理变化
  • 还是不知道怎么解决,请给我解释一下。
  • Nvm 修复了它,谢谢,你说得对! ^^

标签: android realm


【解决方案1】:

好吧,我终于找到了解决方案,很简单:

private void saveListInMap() {
    for (int i = 0; i < listItems.size(); i++) {
        SavedList savedList = new SavedList();
        RealmResults<FoodList> queryListName = realm.where(FoodList.class)
                .equalTo("listName", listItems.get(i))
                .findAll();

        addElementsToList(savedList, queryListName);
        plateMap.put(i,savedList);
    }
}

private void addElementsToList(SavedList savedList, RealmResults<FoodList> queryListName) {
    for (int j = 0; j < queryListName.size(); j++) {
        savedList.setListName(queryListName.get(i).getListName());
        savedList.setRestaurantName(queryListName.get(i).getRestaurantName());
        savedList.addToList(queryListName.get(j).getFoodPlate());
    }
}

只需将设置器添加到循环中...否则我将尝试访问数组中不存在的位置。

希望我能帮助解决这个问题的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 2012-03-28
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 2011-04-10
    相关资源
    最近更新 更多