Android Firebase事务有一个简单的计数器问题

Android Firebase事务有一个简单的计数器问题,android,firebase-realtime-database,transactions,Android,Firebase Realtime Database,Transactions,我的Firebase数据库中有一个非常简单的倒计时 我使用此规则授予节点的访问权限: "actions":{ ".indexOn":[ "timestamp" ], ".read":"auth != null", "$act":{ "countdown":{ ".write":"auth != null && data.val()

我的Firebase数据库中有一个非常简单的倒计时

我使用此规则授予节点的访问权限:

"actions":{
         ".indexOn":[
            "timestamp"
         ],
         ".read":"auth != null",
         "$act":{
            "countdown":{
               ".write":"auth != null && data.val() - newData.val() == 1 && newData.val() >= 0"
            }
         }
      }
初始值仅由我手动设置。。。所以在运行时,用户只能读取值并将其递减1。在我的代码中绝对只有一个调用来编写此节点,我使用以下事务:

@NonNull
public Transaction.Result doTransaction(@NonNull MutableData mutableData) {
    long counter;
    if (mutableData.getValue() == null)
        counter = this.action.getCountdown();
    else
        counter = (long) mutableData.getValue();

    if (counter > 0) {
        mutableData.setValue(counter - 1);
        return Transaction.success(mutableData);
    } else
        return Transaction.abort();
}

public void onComplete(@Nullable DatabaseError databaseError, boolean commited, @Nullable DataSnapshot dataSnapshot) {
        if (databaseError != null && !databaseError.getMessage().contains("network disconnect")) {
            Crashlytics.log("firebase user: " + FirebaseAuth.getInstance().getUid() + " error on action: " + this.action.toString() + " " + (dataSnapshot != null ? dataSnapshot.getValue().toString() : ""));
            Crashlytics.logException(databaseError.toException());
        } else if (commited) {
     do stuff
        }}
但是在我的onComplete期间,我得到了非常多的“
许可被拒绝”
。所有情况下:
FirebaseAuth.getInstance().getUid()
is!=无效的所以我确信没有任何认证问题

我的应用程序每天约有5千名用户使用
我的代码有什么问题来解释为什么在这么简单的计数器中拒绝了这么多许可

=========更新==============
解释上下文:此代码仅在登录后立即调用的活动的“onCreate”期间运行。
innitial if甚至不应该是必要的,因为我100%确定用户只有在成功登录后才能到达这里,但我没有找到任何具体的官方信息,说明当用户在应用程序之间切换很长时间后FirebaseAuth是否会失效,我发现放置if更容易

这绝对是唯一涉及引用数据库节点的代码

if(FirebaseAuth.getInstance().getCurrentUser() != null) 
    App.getDatabaseInstance().getReference(Firebase.BRANCH_ACTIONS).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull final DataSnapshot dataSnapshot) {        
        if (dataSnapshot.hasChildren()) {
            for (final DataSnapshot actionDataSnapshot : dataSnapshot.getChildren()) {
                try {
                    final Action action = actionDataSnapshot.getValue(Action.class);
                    //noinspection ConstantConditions
                    max = action.getTimestamp();

                    if (action.getCountdown() > 0)
                        actionDataSnapshot.child("countdown").getRef().runTransaction(new ActionTransaction(action));
                } catch(Exception e){}
            }
        }
    }
});

您能否编辑您的问题以显示您运行事务的
数据库参考
?另外,如果您确信
FirebaseAuth.getInstance().getUid()
不为空,那么在读/写之前记录它的值,并在问题中包含更新代码和log语句的输出,这将有助于证明这一点。@FrankvanPuffelen根据请求添加更多信息谢谢。请学习正确缩进代码,因为我现在必须花时间使其更具可读性。1) “我百分之百肯定”很酷。因此,用
Log.d(标记,“UID:+FirebaseAuth.getInstance().getCurrentUser().getUid()
或者甚至
如果(FirebaseAuth.getInstance().getCurrentUser()==null)抛出新异常(“用户为null”)
。我比任何人(包括我自己)都更信任代码。2)您的安全规则包含3个必须全部为真的子句。哪一个失败了?你可以通过暂时一个接一个地移除它们来确定。@FrankvanPuffelen,你所说的毫无意义。。。为什么我要在“if”子句中检查
FirebaseAuth.getInstance().getUid()
的值之后立即记录它?(
'FirebaseAuth.getInstance().getCurrentUser().getUid()”
这会引发
nullpointerexception
)我也非常想知道哪个子句失败了,但firebase没有提供任何调试方法。。。仅仅为了调试而在生产中使用数据库规则是非常幼稚的,我在这里试图帮助Rafael。除非你能提供额外的信息,否则我无法提供。