Java 支付Firebase Android时的子值计数器

Java 支付Firebase Android时的子值计数器,java,android,database,firebase,firebase-realtime-database,Java,Android,Database,Firebase,Firebase Realtime Database,我正在附上firebase数据库的图表。 我想在成功付款后更新键“eventsregistered”的值 唯一的要求是在成功付款后增加用户注册事件的数量。付款功能由我处理。我面临的问题是,我可以在付款时更改孩子的值,但每次启动应用程序时计数器都会重置为零。请为我提供一个具有正确代码的解决方案。我尝试过使用.setValue方法,但没有成功 我尝试了以下代码,但没有成功。 付款完成后,将执行以下功能。逻辑似乎没问题,但当我重置应用程序时,键的值被重置为零,原因我不知道 代码附在下面 int re

我正在附上firebase数据库的图表。

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

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

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

代码附在下面

int regEvents=0;
字符串事件\u registed=“0”;
私人无效btnAddRegisteredEvents(){
最后一个字符串key2=FirebaseAuth.getInstance().getCurrentUser().getUid();
final DatabaseReference databaseReferenceObj2=FirebaseDatabase.getInstance()
.getReference().child(“用户”)
.child(键2)。child(“事件登记”);
databaseReferenceObj2.addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
events_registed=dataSnapshot.getValue(String.class);
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});
regEvents=Integer.parseInt(已注册事件)+1;
databaseReferenceObj2.setValue(String.valueOf(regEvents));
}

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

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

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

文档中有一个新的名称。但这比你需要的要复杂一点。我认为这将代替您当前调用的
addValueEventListener
和函数的其余部分:

databaseReferenceObj2.runTransaction(newtransaction.Handler()){
@凌驾
公共事务.Result doTransaction(MutableData MutableData){
long newValue=1;//如果它不存在,则假定为零并递增为1。
String currentValue=mutableData.getValue(String.class);
if(currentValue!=null){
newValue=Long.parseLong(currentValue)+1;
}
//设置值并报告事务成功
mutableData.setValue(String.valueOf(newValue));
返回事务。成功(可变数据);
}
@凌驾
public void onComplete(DatabaseError DatabaseError,布尔b,
数据快照(数据快照){
//交易完成
Log.d(标记“postTransaction:onComplete:+databaseError”);
}
});

编写此代码是为了处理以下事实:您当前正在将此数字存储为字符串,但将其存储为数字(例如
Long
)可能更有意义。

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

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

文档中有一个新的名称。但这比你需要的要复杂一点。我认为这将代替您当前调用的
addValueEventListener
和函数的其余部分:

databaseReferenceObj2.runTransaction(newtransaction.Handler()){
@凌驾
公共事务.Result doTransaction(MutableData MutableData){
long newValue=1;//如果它不存在,则假定为零并递增为1。
String currentValue=mutableData.getValue(String.class);
if(currentValue!=null){
newValue=Long.parseLong(currentValue)+1;
}
//设置值并报告事务成功
mutableData.setValue(String.valueOf(newValue));
返回事务。成功(可变数据);
}
@凌驾
public void onComplete(DatabaseError DatabaseError,布尔b,
数据快照(数据快照){
//交易完成
Log.d(标记“postTransaction:onComplete:+databaseError”);
}
});

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

您的问题中包含了JSON树的图片。请将其替换为实际的JSON文本,您可以通过单击溢出菜单中的导出JSON链接轻松获得该文本(⠇) 当然。将JSON作为文本可以进行搜索,使我们能够轻松地使用它来测试您的实际数据,并在我们的答案中使用它,这通常是一件好事。您的问题中包含了JSON树的图片。请将其替换为实际的JSON作为文本,您可以轻松地使用它