如何在Android Firebase中运行事务

时间:2018-07-17 12:11:35

标签: android firebase firebase-realtime-database

我正在使用公交车预订应用程序。因此,每当用户预订乘车时,我都会存储该特定乘车的凭据(名称,电子邮件)。但是我还需要限制该乘车的预订数量(仅每次骑行20次)。为此,我正在使用Firebase事务。最初,我在位置mref1处的值为0(零),然后我使用事务对其进行了更新,但是当我运行代码时,这是第一次。无法更新,然后开始更新。谁能告诉我如何?下面是我的数据库代码(mref1是我要存储预订数量的位置)My Database structure`

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.");

        }
    });
}

}

1 个答案:

答案 0 :(得分:0)

根据此 post 的答案,并查看您的代码,以解决此问题,建议您首先使用以下代码行检查无效性:

if(CurrentValue != null) {}