【问题标题】:java.lang.IllegalStateException: Object is no longer managed by Realm. Has it been deleted?java.lang.IllegalStateException:对象不再由 Realm 管理。它被删除了吗?
【发布时间】:2016-05-04 13:12:29
【问题描述】:

我正在学习 Realm 和 Recyclerview。我制作了简单的应用程序,您可以在其中简单地添加和删除项目。一切正常,直到我开始一项一项地删除项目。在我点击删除的最后一项时,它给了我例外

java.lang.IllegalStateException: Object is no longer managed by Realm. Has it been deleted?

这是我的代码

  @Override
    public void onDeleteClick(int position) {
        mRealm.beginTransaction();
        mResult.get(position).deleteFromRealm();
        mRealm.commitTransaction();
        adapter.notifyItemRemoved(position);
    }

这里是全栈

  java.lang.IllegalStateException: Object is no longer managed by Realm. Has it been deleted?
                                                                           at io.realm.internal.InvalidRow.getStubException(InvalidRow.java:192)
                                                                           at io.realm.internal.InvalidRow.getString(InvalidRow.java:88)
                                                                           at io.realm.PersonsRealmProxy.realmGet$firstName(PersonsRealmProxy.java:67)
                                                                           at techiespk.realmpractice.Persons.getFirstName(Persons.java:22)
                                                                           at techiespk.realmpractice.MyListAdapter.onBindViewHolder(MyListAdapter.java:44)
                                                                           at techiespk.realmpractice.MyListAdapter.onBindViewHolder(MyListAdapter.java:15)
                                                                           at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:5471)
                                                                           at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:5504)
                                                                           at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4741)
                                                                           at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4617)
                                                                           at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1994)
                                                                           at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1390)
                                                                           at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1353)
                                                                           at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:574)
                                                                           at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3028)
                                                                           at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2906)
                                                                           at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3283)

【问题讨论】:

  • 您显然是在删除对象后尝试读取firstName。一种解决方案是在您的onBindViewHolder 方法中使用obj.isValid(),并在发生这种情况时使用“已删除”状态。

标签: android android-recyclerview realm


【解决方案1】:

好的,感谢 Christian Melchior 的帮助。我通过这样做修复了我的代码

之前

   @Override
    public void onBindViewHolder(MyListViewHolder holder, int position) {
            Persons p = persons.get(position);
            holder.firstName.setText(p.getFirstName());
            holder.lastName.setText(p.getLastName());
    }

之后

   @Override
    public void onBindViewHolder(MyListViewHolder holder, int position) {

        if (persons.get(position).isValid()) {
            Persons p = persons.get(position);
            holder.firstName.setText(p.getFirstName());
            holder.lastName.setText(p.getLastName());
        }
    }

【讨论】: