提问者:小点点

Firebase RTDB Unity-RunTransaction始终返回Null


初始调用是:

    db_reference
    .Child("total_users")
    .RunTransaction(RunTransaction)
    .ContinueWithOnMainThread(task => {
        if (task.Exception != null) {
            Debug.Log("Transaction exception.");
        } else if (task.IsCompleted) {
            Debug.Log("Transaction complete.");
        }
    });

它呼吁:

TransactionResult RunTransaction(MutableData mutableData) {
    List<object> data = mutableData.Value as List<object>;
    if (data != null) {
        Debug.Log("data not null: " + data);
        // I want to increment data here but mutableData always null       
    } else {
        Debug.Log("data null");
    }
    return TransactionResult.Success(mutableData);
}

目标是简单地从可变数据中获取一个值并递增它,但是这总是返回null,而不是存储在RTDB中的数据。除了记录null之外,事务也没有错误地完成。

  • Firebase UnitySDK9.4.0
  • Unity版本:2021.3.9f1

此外,当我更新值时为null:

TransactionResult RunTransaction(MutableData mutableData) {
    List<object> data = mutableData.Value as List<object>;
    if (data != null) {
        Debug.Log("data not null: " + data);
        // I want to increment data here but mutableData always null       
    } else {
        Debug.Log("data null");
        // settings default value as per docs below
        Dictionary<string, object> newData = new Dictionary<string, object>();
        newData["total_users"] = 1;
        mutableData.Value = newData;
    }
    return TransactionResult.Success(mutableData);
}

这确实成功更新了RTDB中的值,但这似乎覆盖了存储的实际值,该值没有通过,并且对于接收到的mutableData始终显示null。

任何帮助非常感谢。


共1个答案

匿名用户

获取当前值的初始null是预期的行为。

Firebase会立即调用您的回调,并对节点的当前值进行最佳猜测,通常是null。即使您知道这永远不会是值,SDK也无法知道。因此,您的代码应该处理null(例如通过返回像0这样的初始值),然后在SDK从服务器获得更新的当前值后再次调用。

另见:

  • Firebase事务api调用当前数据为空
  • Firebase事务返回null并在没有错误的情况下完成
  • Firebase事务在路径处读取null,即使该路径处有数据