【发布时间】:2018-01-30 15:50:25
【问题描述】:
我正在学习 Android 中的 Firebase,我正在尝试使用它们各自的插槽制作一个房间系统。在这种情况下,多个用户可能希望同时访问同一个插槽,因此我决定使用 Firebase 事务。
所以当用户尝试登录我的插槽时:
mySlotRef1.runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData mutableData) {
Slot p = mutableData.getValue(Slot.class);
if (p == null) {
return Transaction.success(mutableData);
}
if (p.getState().equals("closed")) {
return Transaction.abort();
}
// Set value and report transaction success
Slot sl1 = new Slot("slot1", idRoom, auth.getCurrentUser().getDisplayName(), auth.getCurrentUser().getUid(), "closed", Profile.getCurrentProfile().getProfilePictureUri(200, 200).toString());
mutableData.setValue(sl1);
return Transaction.success(mutableData);
}
@Override
public void onComplete(DatabaseError databaseError, boolean b,
DataSnapshot dataSnapshot) {
// Transaction completed
Log.d(TAG, "postTransaction:onComplete:" + databaseError);
}
});
我认为这行得通,我。 e.当插槽关闭时,它只进入一个用户并拒绝“插槽”参考中的其他用户。但是问题是我还需要更新“用户”目录中的另外两个值,我找不到“仅当用户占用插槽时”的方法,即,交易完成的时间。
更新: 这是我检查插槽是否打开的部分。
mySlotRef1.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Slot data = dataSnapshot.getValue(Slot.class);
state = data.getState();
if (state.equals("open")) {
saveSlot(slot);
} else {
Toast.makeText(getApplicationContext(), "Slot not available", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
【问题讨论】:
标签: android firebase firebase-realtime-database