android - 无法在写入事务之外修改托管对象(Realm + Android)

标签 android kotlin realm realm-mobile-platform

我已经实现了以下方法来从 Realm 数据库更新 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)

最佳答案

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

关于android - 无法在写入事务之外修改托管对象(Realm + Android),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48886931/

相关文章:

android - Realm 异常 'value' 不是有效的托管对象

java - 使用RealmRecyclerViewAdapter和Drag&Drop进行运动动画

android - 找不到符号 GoogleApiAvailability

android - 在模拟器上添加联系人的程序不会在 HTC Desire 上添加联系人

android - 应用多个 ForegroundColorSpan

java - Android三元运算符对自定义 View 的自定义颜色属性

android - Galaxy 选项卡的布局设计

java - 如何在多个包 ID(同一项目)Android 中使用 Firebase 远程配置

java - Android房间如何增加计数字段并更新特定的行字段

javascript - 应用程序崩溃并显示 'Accessing object of type which has been invalidated or deleted' 错误消息?