如何在android Firebase中运行事务



我正在开发一款巴士预订应用程序。因此,每当用户预订乘车时,我都会存储他特定乘车的凭据(姓名、电子邮件(。但我也需要限制该次骑行的预订数量(比如每次骑行仅20次(。为此,我使用firebase事务。最初,我在位置mref1处的值为0(零(,然后我使用事务更新了它,但当我运行代码时,它第一次没有更新,然后开始更新。有人能告诉我怎么做吗?下面是我的数据库代码(mref1是我想存储预订数量的位置(我的数据库结构`

private DatabaseReference mDatabase1;
private DatabaseReference mDatabase2;
private DatabaseReference mref1;
private DatabaseReference mref2;
private FirebaseAuth mAuth;
private static final String TAG = "BookingActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_booking);
mAuth = FirebaseAuth.getInstance();
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
mDatabase1 = FirebaseDatabase.getInstance().getReference().child("Time1");
mDatabase2 = FirebaseDatabase.getInstance().getReference().child("Time2");
mref1 = FirebaseDatabase.getInstance().getReference().child("Count@Time1");
mref2 = FirebaseDatabase.getInstance().getReference().child("Count@Time2");
findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Book(mDatabase1,mref1);
}
});
findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Book(mDatabase2,mref2);
}
});
}

public void Book(DatabaseReference mDatabase,DatabaseReference mref) {
final FirebaseUser user = mAuth.getCurrentUser();
HashMap<String,String>datamap = new HashMap<>();
if(user!=null) {
datamap.put("Name", user.getDisplayName());
datamap.put("Email", user.getEmail());
}
mDatabase.push().setValue(datamap);
Update(mref);
Toast.makeText(BookingActivity.this, "Booked Successfully", Toast.LENGTH_SHORT).show();
}
public void Update(DatabaseReference mDatabase) {
mDatabase.runTransaction(new Transaction.Handler() {
@NonNull
@Override
public Transaction.Result doTransaction(@NonNull MutableData mutableData) {
Integer CurrentValue = mutableData.getValue(Integer.class);
mutableData.setValue(CurrentValue+1);
return Transaction.success(mutableData);
}
@Override
public void onComplete(@Nullable DatabaseError databaseError, boolean b, @Nullable DataSnapshot dataSnapshot) {
Log.d(TAG, "Updating count transaction is completed.");
}
});
}

}

根据这篇文章的答案,并看到您的代码,为了解决这个问题,我建议您首先使用以下代码行检查无效性:

if(CurrentValue != null) {}

最新更新