【问题标题】:Cannot modify managed objects outside of a write transaction ( Realm + Android )无法在写事务之外修改托管对象(Realm + Android)
【发布时间】:2018-02-20 13:56:05
【问题描述】:

我已经实现了以下方法从领域数据库更新UserProfile

override fun updateCurrentUser(userProfile: UserProfile, successAction: () -> Unit) {
        val realm = Realm.getDefaultInstance()
        realm.executeTransactionAsync(
                object : Realm.Transaction {
                    override fun execute(realm: Realm) {

                        val user = realm.where(UserProfile::class.java).equalTo("userName", userProfile.userName).findFirst()
                        user?.firstName = userProfile.firstName
                        user?.lastName = userProfile.lastName
                        user?.gender = userProfile.gender
                        user?.height = userProfile.height
                        user?.weight = userProfile.weight
                        user?.dob = userProfile.dob
                        user?.firstTimeSetupDone = true

                    }
                },
                object : Realm.Transaction.OnSuccess {
                    override fun onSuccess() {
                        Log.i(TAG, "Saved User successfully with $userProfile")
                        successAction()
                    }

                },
                object : Realm.Transaction.OnError {
                    override fun onError(error: Throwable?) {
                        Log.e(TAG, "Error saving user", error)
                    }
                }
        )
    }

但即使我在realm.executeTransactionAsync 下执行它也会引发以下错误

java.lang.IllegalStateException: Cannot modify managed objects outside of a write transaction.
                                                                            at io.realm.internal.Table.throwImmutable(Table.java:674)
                                                                            at io.realm.internal.Table.checkImmutable(Table.java:549)
                                                                            at io.realm.internal.UncheckedRow.setString(UncheckedRow.java:230)
                                                                            at io.realm.UserProfileRealmProxy.realmSet$firstName(UserProfileRealmProxy.java:209)
                                                                            at saukya.wellness.mobile.services.data.domain.UserProfile.setFirstName(UserProfile.kt:27)
                                                                            at saukya.wellness.mobile.ui.onboarding.OnBoardingPresenter.submitData(OnBoardingPresenter.kt:102)
                                                                            at saukya.wellness.mobile.ui.onboarding.OnBoardingActivity.submitData(OnBoardingActivity.kt:106)
                                                                            at saukya.wellness.mobile.ui.onboarding.OnBoardingHealthInfoFragment$setupNextButton$1.onClick(OnBoardingHealthInfoFragment.kt:86)
                                                                            at android.view.View.performClick(View.java:5646)
                                                                            at android.view.View$PerformClick.run(View.java:22459)
                                                                            at android.os.Handler.handleCallback(Handler.java:761)
                                                                            at android.os.Handler.dispatchMessage(Handler.java:98)
                                                                            at android.os.Looper.loop(Looper.java:156)
                                                                            at android.app.ActivityThread.main(ActivityThread.java:6523)
                                                                            at java.lang.reflect.Method.invoke(Native Method)
                                                                            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
                                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)

【问题讨论】:

  • 您在submitData 中遇到了异常。这是updateCurrentUser

标签: android kotlin realm realm-mobile-platform


【解决方案1】:

realm查询的对象不能修改,解决这个问题的简单方法是新建一个对象,将realm对象字段复制到这个新对象。如果要持久化,调用insertOrUpdate方法保存到realm中。

【讨论】:

    【解决方案2】:

    你可以调用它来启动事务,因为错误说你必须打开写事务:

    realmObj.beginTransaction();
    //do your updating stuff here
    realmObj.commitTransaction();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多