付款时的子值计数器 Firebase Android

Posted

技术标签:

【中文标题】付款时的子值计数器 Firebase Android【英文标题】:Child Value counter upon making payment Firebase Android 【发布时间】:2020-03-22 08:23:55 【问题描述】:

我附上了我的 firebase 数据库的图表。 https://drive.google.com/open?id=11p5xmLjHC49sqzvXYo3Au5GdNnULdnom

我想在付款成功后更新“eventsregistered”键的值。

唯一的要求是在支付成功后增加用户注册事件的数量。付款功能由我处理。我面临的问题是我可以在付款时更改孩子的价值,但每次启动应用程序时计数器都会重置为零。请为我提供正确代码的解决方案。我尝试过使用 .setValue 方法,但没有成功。

我已尝试使用以下代码,但没有成功。 付款完成后执行以下功能。逻辑似乎没问题,但是当我重置应用程序时,键的值被重置为零,我无法知道。

代码附在下面

int regEvents = 0;
String events_registered = "0";

private void btnAddRegisteredEvents() 
    final String key2 = FirebaseAuth.getInstance().getCurrentUser().getUid();

    final DatabaseReference databaseReferenceObj2 = FirebaseDatabase.getInstance()
            .getReference().child("Users")
            .child(key2).child("eventsregistered");
    databaseReferenceObj2.addValueEventListener(new ValueEventListener() 
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) 
            events_registered = dataSnapshot.getValue(String.class);
        

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) 

        
    );
    regEvents = Integer.parseInt(events_registered) + 1;
    databaseReferenceObj2.setValue(String.valueOf(regEvents));

请帮助我使用此代码,并帮助我在成功付款后更新已注册 evets 的计数器。提醒一下,支付功能已经由我处理。需要的是在成功付款后递增键“registeredevents”的值的代码。

【问题讨论】:

您在问题中包含了 JSON 树的图片。请将其替换为实际的 JSON 作为文本,您可以通过单击 your Firebase Database console 的溢出菜单 (⠇) 中的 Export JSON 链接轻松获得。将 JSON 作为文本使其可搜索,让我们可以轻松地使用它来测试您的实际数据并在我们的答案中使用它,一般来说这只是一件好事。 【参考方案1】:

由于从 Firebase 检索数据的方式具有异步性质,您的代码无法正常工作。在尝试使用其结果之前,您需要确保读取完成。实际上,您开始读取,然后立即尝试使用结果。

但更糟糕的是——在读取完成后,您无法防止其他人同时修改数据。您需要在事务中执行此操作。

文档中有good example of a counter。但它比你需要的要复杂一些。我认为这将代替您当前调用 addValueEventListener 和其余功能的位置为您工作:

    databaseReferenceObj2.runTransaction(new Transaction.Handler() 
        @Override
        public Transaction.Result doTransaction(MutableData mutableData) 
            long newValue = 1; // If it doesn't exist, assume zero and increment to 1.
            String currentValue = mutableData.getValue(String.class);
            if (currentValue != null) 
                newValue = Long.parseLong(currentValue) + 1;
            

            // Set value and report transaction success
            mutableData.setValue(String.valueOf(newValue));
            return Transaction.success(mutableData);
        

        @Override
        public void onComplete(DatabaseError databaseError, boolean b,
                               DataSnapshot dataSnapshot) 
            // Transaction completed
            Log.d(TAG, "postTransaction:onComplete:" + databaseError);
        
    );

这是为了处理您当前将此数字存储为字符串这一事实,但将其存储为数字可能更有意义(例如Long)。

【讨论】:

以上是关于付款时的子值计数器 Firebase Android的主要内容,如果未能解决你的问题,请参考以下文章

从 Firebase 仅检索当前用户的子值

从 Firebase 查询具有在 ArrayList 中找到的子值的对象

使用javascript在firebase中自动增加一个值

如何获取内部子值 Firebase?

Firebase 按子值搜索

如何读取 Firebase 子值?