java - Realm 未写入,因为已执行写入操作

标签 java android realm

我正在尝试更新我的回收器 View ,以便当单击其中一项上的加号按钮时,该项目上的数量 TextView 会增加 1。

以下是适配器中点击监听器的代码。

holder.mQuantityPlusTextView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mEventBus.post(new CartQuantityPlusClickEvent(imgUrl));
                notifyDataSetChanged();
            }
        }); 

这是订阅EventBus的 Activity 的代码。

@Subscribe(threadMode = ThreadMode.POSTING)
public void cartQuantityPlusClick(CartQuantityPlusClickEvent event) {
    mClothingRepository.plusClothingCartQuantity(event.getImgUrl());
}

这是实际数量更新的代码。

@Override
public void plusClothingCartQuantity(String imgUrl) {
    CartItem item = mRealm.where(CartItem.class).equalTo("imgUrl", imgUrl).findFirst();

    mRealm.beginTransaction();

    if (item != null)
        item.increasQuantity(); Log.d(TAG, item.getQuantityInCart() + "");

    mRealm.commitTransaction();
}

当我运行应用程序并按下按钮时。尽管与减少有效数量的代码完全相同,但数量没有发生变化。

这是减少数量的代码(适配器和事件总线的代码实际上是相同的)。

@Override
public void minusClothingCartQuantity(String imgUrl) {
    CartItem item = mRealm.where(CartItem.class).equalTo("imgUrl", imgUrl).findFirst();
    mRealm.beginTransaction();

    if (item != null) {
        if (item.getQuantityInCart() == DEFAULT_CART_ITEM_QUANTITY) {
            item.deleteFromRealm();
        } else
            item.decreaseQuantity();
    }

    RealmResults<CartItem> cartItems = mRealm.where(CartItem.class).findAll();
    if (cartItems.size() == 0)
        mEventBus.post(new EmptyCartEvent());

    mRealm.commitTransaction();
}

代码中用于增加数量的日志语句表示 item 变量为 null,并且:

12-29 12:25:31.881 21538-21538/com.geteven.gooddeal E/REALM_JNI: jni: ThrowingException 8, The Realm is already in a write transaction in /Users/cm/Realm/realm-java-release/realm/realm-library/src/main/cpp/io_realm_internal_OsSharedRealm.cpp line 126, .
12-29 12:25:31.882 21538-21538/com.geteven.gooddeal E/REALM_JNI: Exception has been thrown: The Realm is already in a write transaction in /Users/cm/Realm/realm-java-release/realm/realm-library/src/main/cpp/io_realm_internal_OsSharedRealm.cpp line 126
12-29 12:25:31.884 21538-21538/com.geteven.gooddeal E/EventBus: Could not dispatch event: class com.geteven.gooddeal.event.CartQuantityPlusClickEvent to subscribing class class com.geteven.gooddeal.view.CartActivity
                                                                java.lang.IllegalStateException: The Realm is already in a write transaction in /Users/cm/Realm/realm-java-release/realm/realm-library/src/main/cpp/io_realm_internal_OsSharedRealm.cpp line 126
                                                                    at io.realm.internal.OsSharedRealm.nativeBeginTransaction(Native Method)
                                                                    at io.realm.internal.OsSharedRealm.beginTransaction(OsSharedRealm.java:282)
                                                                    at io.realm.BaseRealm.beginTransaction(BaseRealm.java:389)
                                                                    at io.realm.Realm.beginTransaction(Realm.java:135)
                                                                    at com.geteven.gooddeal.repository.ClothingRepository.plusClothingCartQuantity(ClothingRepository.java:145)
                                                                    at com.geteven.gooddeal.view.CartActivity.cartQuantityPlusClick(CartActivity.java:190)
                                                                    at java.lang.reflect.Method.invoke(Native Method)
                                                                    at org.greenrobot.eventbus.EventBus.invokeSubscriber(EventBus.java:485)
                                                                    at org.greenrobot.eventbus.EventBus.postToSubscription(EventBus.java:416)
                                                                    at org.greenrobot.eventbus.EventBus.postSingleEventForEventType(EventBus.java:397)
                                                                    at org.greenrobot.eventbus.EventBus.postSingleEvent(EventBus.java:370)
                                                                    at org.greenrobot.eventbus.EventBus.post(EventBus.java:251)
                                                                    at com.geteven.gooddeal.adapter.CartAdapter$3.onClick(CartAdapter.java:122)
                                                                    at android.view.View.performClick(View.java:6289)
                                                                    at android.view.View$PerformClick.run(View.java:24800)
                                                                    at android.os.Handler.handleCallback(Handler.java:789)
                                                                    at android.os.Handler.dispatchMessage(Handler.java:98)
                                                                    at android.os.Looper.loop(Looper.java:164)
                                                                    at android.app.ActivityThread.main(ActivityThread.java:6809)
                                                                    at java.lang.reflect.Method.invoke(Native Method)
                                                                    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

我从包含所有业务逻辑的存储库类的构造函数中获取 Realm 实例。

public ClothingRepository() {
    mEventBus = EventBus.getDefault();
    mRealm = Realm.getDefaultInstance();
    mClothingRef = FirebaseDatabase.getInstance().getReference()
            .child(FIREBASE_CLOTHING_REFERENCE);
}

我不关闭它,因为我不知道如何关闭。我觉得这可能是问题的一部分。我该如何解决这个问题?

最佳答案

在使用 Realm 之前,您应该始终获取 Realm 的实例。使用完毕后关闭实例。

@Override
public void plusClothingCartQuantity(String imgUrl) {
    Realm realm = Realm.getDefaultInstance();
    CartItem item = realm.where(CartItem.class).equalTo("imgUrl", imgUrl).findFirst();

    realm.beginTransaction();

    if (item != null)
        item.increasQuantity(); Log.d(TAG, item.getQuantityInCart() + "");

    realm.commitTransaction();
    realm.close()
}

请参阅我的函数代码,您应该使用它。首先,您不应该使用 mRealm 字段,并且每次需要进行任何数据库操作时都不应调用 Realm.getDefaultInstance()。 使用后别忘了调用realm.close()

关于java - Realm 未写入,因为已执行写入操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48021911/

相关文章:

java - Java 中的验证框架

Java HashMap 或 IdentityHashMap

android - onLocationChanged 总是返回我的旧位置

ios - 在 UITableView 中的 UINib 中重新加载 UITableView

Java内存不足: increase heap space?

java - JSONObject.toString() 正在创建 OutOfMemoryError

android - 重启 Activity Android

Android AsyncTask ProgressDialog轮换配置不同

swift - 使用主键列表过滤从 Realm 查询多个对象

android - 在 UI 线程中使用单例作为 Realm