我有一个使用Realm.io存储实体的项目,以前工作正常,但现在我有一个包含3个片段的片段或活动,其中包含Realm对象列表。
每当我切换到一个页面并返回到第一个页面(或者只是返回页面时)。我得到java.lang.IllegalStateException:非法状态:行/对象不再有效进行操作。它被删除了吗?
这似乎是因为对象不再有效。是否有一种简单的方法来分离它们或什么?尽管如此,如果他们保持管理会很好,因为我有时希望能够删除它们。
从数据库中查询这些项目,当没有足够的项目时,它们将从API加载。这里没有使用任何非常奇特的东西,三个带有适配器的列表加载实体。每个列表的差异是字符串值状态,表示它是否处于某种状态。
在单击列表项以显示详细信息后,从适配器加载项目时出现错误:
MyEntity myEntity = (MyEntity) adapter.getItem(position);
intent.putExtra("id", myEntity.getId()) <-- this part will crash it.
,例外:
java.lang.IllegalStateException: Illegal State: Row/Object is no longer valid to operate on. Was it deleted?
我想这是因为它在三个位置(3个选项卡)查询相同类型的数据。虽然我希望这不是一个问题,因为它们都有自己的适配器和项目列表。从他们自己的实例中获取。
这是我的“Loader”类调用的代码,它处理来自DB和/或Api的提取。
public void loadResult(List result,boolean isFinished){ //不是最好的速度,但最多10个项目,没有重复和尊重原始订单是好的 尝试{ for(RealmObject ro:result){ 记录r =(记录)ro;
int itemIndex = items.indexOf(r);
if (itemIndex > -1) {
items.set(itemIndex, r);
} else {
items.add(r);
}
}
} catch (IllegalStateException e) {
ErrorClass.log(e);
}
notifyDataSetChanged();
setLoading(!isFinished);
end = result.size() < 10 && isFinished;
}
简而言之,加载器类就是这样做的,它不是单例,它是每个Listview(Recycler)的新实例
List result = null;
if (sortKey != null) {
result = query.findAllSorted(sortKey, ascending);
} else {
result = query.findAll();
}
if (result.size() < PAGE_SIZE && retry == 0) {
isFinished = false;
retry++;
getPageFromApi(pageNumber);
} else if (retry > 0) {
retry = 0;
}
adapter.loadResult(result, isFinished);
getPageFromApi将导致再次调用此代码,并且将在列表中替换现有实体,添加新项目。因此,单击列表时,列表中不应存在旧的已删除项目。
我认为这可能非常具体,但我的问题必须有全球性的原因/解决方案。
答案 0 :(得分:0)
愚蠢的我,由于之前的错误,我在try catch中添加了新元素,出现了什么问题非常简单。在Loader中,从我们的API获取的项目正在更新或创建新项目。这意味着列表中的那些在那一点上是无效的,或者至少是指向它们的指针?不确定它是如何在幕后工作的。
我做了什么来修复它,循环遍历所有当前项目,并检查isValid(),如果为false则该项目将被删除。否则我正在检查新项目是否在当前项目列表中,这会导致错误发生在.equals函数中!
这一件事可能是一个核心错误,但我认为这只是我的错误!