【问题标题】:Kotlin Firebase Realtime database transaction errorsKotlin Firebase 实时数据库事务错误
【发布时间】:2020-09-19 17:41:16
【问题描述】:

我有以下代码

   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)

这是我的 User.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
)

我做错了什么?

【问题讨论】:

  • 你能调试一下看看到底是哪里崩溃了吗?
  • 错误发生在哪一行代码? invitedBy 的确切值是多少?还请将您的数据库结构添加为 JSON 文件或至少是屏幕截图。
  • 这是崩溃的行 if (u.numReferrals == null || u.referralEarning == null) { // 取消给帖子加星标并从星标中删除自我 u.numReferrals = 1 u.referralEarning = 1; } else { // 为帖子加注星标并将自己添加到星标 u.numReferrals = u.numReferrals!! + 1 u.referralEarning = u.referralEarning!! + 1; }
  • 可能是你为空?
  • @MirianaItani u 不能为空,因为它会进入返回语句:val u = mutableData.getValue(User::class.java) ?: return Transaction.success(mutableData)

标签: android firebase kotlin firebase-realtime-database


【解决方案1】:

请看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? - 它是一个 nullable 对象(标有? 运算符的可空对象),如果您不是100% 确定它,则不能在其上使用!! 运算符不为空。

您也可以在 nullable 对象上使用? 运算符来调用其方法或属性,例如:

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

More info about Null Safety in Kotlin.

【讨论】:

    猜你喜欢
    • 2021-11-23
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    • 2018-12-29
    • 1970-01-01
    • 2020-12-29
    • 2020-05-15
    • 1970-01-01
    相关资源
    最近更新 更多