当前位置: 首页 > 知识库问答 >
问题:

Kotlin Firebase实时数据库事务错误

宁欣怿
2023-03-14
   database.child("users").child(this.invitedBy).runTransaction(object : Transaction.Handler {
                override fun doTransaction(mutableData: MutableData): Transaction.Result {
                    val u = mutableData.getValue(User::class.java)
                        ?: return Transaction.success(mutableData)

                    if (u.numReferrals == null || u.referralEarning == null) {
                        // Unstar the post and remove self from stars
                        u.numReferrals = 1
                        u.referralEarning = 1;
                    } else {
                        // Star the post and add self to stars
                        u.numReferrals = u.numReferrals!! + 1
                        u.referralEarning = u.referralEarning!! + 1;
                    }

                    // Set value and report transaction success
                    mutableData.value = u
                    return Transaction.success(mutableData)
                }

                override fun onComplete(
                    databaseError: DatabaseError?,
                    committed: Boolean,
                    currentData: DataSnapshot?
                ) {
                    // Transaction completed
                    Log.d("MUser", "postTransaction:onComplete:" + databaseError!!)
                }
            })
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.test.test, PID: 5375
    kotlin.KotlinNullPointerException
        at com.test.test.MUser$setReferral$1.onComplete(MUser.kt:229)
        at com.google.firebase.database.core.Repo$16$1.run(com.google.firebase:firebase-database@@19.2.1:1006)
        at android.os.Handler.handleCallback(Handler.java:907)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7478)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:549)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:941)
W/System.err: kotlin.KotlinNullPointerException
W/System.err:     at com.test.test.MUser$setReferral$1.onComplete(MUser.kt:229)
        at com.google.firebase.database.core.Repo$16$1.run(com.google.firebase:firebase-database@@19.2.1:1006)
        at android.os.Handler.handleCallback(Handler.java:907)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7478)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:549)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:941)

这是我的用户。kt

import com.google.firebase.database.IgnoreExtraProperties

// [START rtdb_user_class]
@IgnoreExtraProperties
data class User(
    var id: String = "",
    var name: String = "",
    var email: String = "",
    var userReads: Int? = 0,
    var userPlays: Int? = 0,
    var userWatches: Int? = 0,
    var paidDate : Int? = 0,
    var endPaidDate : Int? = 0,
    var paidStatus : String? = "",
    var paymentMethod : String? = "",
    var planid : String? = "",
    var firebaseUid : String? = "",
    var referralEarning : Int? = 0,
    var numReferrals : Int? = 0
)

我做错了什么?

共有1个答案

朱兴运
2023-03-14

请看oncomplete方法:

override fun onComplete(
                    databaseError: DatabaseError?,
                    committed: Boolean,
                    currentData: DataSnapshot?
                ) {
                    // Transaction completed
                    Log.d("MUser", "postTransaction:onComplete:" + databaseError!!)
                }

在引用DatabaseError参数时使用!!运算符,但该运算符可以为null,因此不能使用!!。为了避免此异常,只需删除!!运算符:

Log.d("MUser", "postTransaction:onComplete:" + databaseError)

databaseerror:databaseerror?-它是一个可为空的对象(用运算符标记的可为空的对象),如果不能100%确定它不是空的,则不能对它使用!!运算符。

Log.d("MUser", "postTransaction:onComplete:" + databaseError?.getMessage())
 类似资料:
  • 我一直试图运行事务方法,但它无法在firebase数据库中获取和设置正确的数据。 代码如下:

  • 一、Attach数据库: ATTACH DATABASE语句添加另外一个数据库文件到当前的连接中,如果文件名为":memory:",我们可以将其视为内存数据库,内存数据库无法持久化到磁盘文件上。如果操作Attached数据库中的表,则需要在表名前加数据库名,如dbname.table_name。最后需要说明的是,如果一个事务包含多个Attached数据库操作,那么该事务仍然是原子的。见如下示例:

  • 假设我们有两个服务,A和B。服务A有一个函数执行以下操作: 验证数据 现在,让我们假设以下步骤之一,步骤3或4失败。由于服务B对数据库进行了更改,这些更改仍然存在。 在这种情况下,有没有办法回滚数据库?我曾考虑过数据库事务,但在nest js中找不到任何方法来实现这一点,尽管TypeOrm支持它,但nest看起来并不自然。如果不是的话,我现在被服务B所做的更改“卡住”了,但是如果没有服务B所做的更

  • 事务的特性 所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。 Atomicity(原子性) 原子性是指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生。 Consistency(一致性) 一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。 Isolati

  • 我的在live server上类似这样的环境文件设置。但当我在的时候 错误是 我使用这个主机和密码通过putty访问我的sshhttp://5.100.156.10:2082我很困惑。