所以我有一个简单的预订系统,我允许用户使用Firebase预订门票。我正在使用事务来避免并发问题。
基本上这是DB的结构:
TerminalID:
BussID:
SeatID:
TempEmail:
所以这是我想要预订1号巴士座位的例子.aarList是用户想要预订的座位ID的座位列表。为了预订,我向seatID添加了一封临时电子邮件。
DatabaseReference postRef = mDatabase.child("terminal").child("1");
postRef.runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData mutableData) {
if(mutableData.getValue() == null){
return Transaction.success(mutableData);
}
for (int i = 0; i < seatList.size(); i++) {
if (mutableData.child(Integer.toString(seatList.get(i))).child("tempEmail").getValue() == null) {
mutableData.child(Integer.toString(seatList.get(i))).child("tempEmail").setValue(mUser.getEmail());
}
else{
Transaction.abort();
}
}
return Transaction.success(mutableData);
}
@Override
public void onComplete(DatabaseError databaseError, boolean b, DataSnapshot dataSnapshot) {
progressBar.setVisibility(View.INVISIBLE);
// Transaction completed
if (b == true){
Toast.makeText(getContext(), "Success!",
Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(getContext(), "Someone just reserved them!", Toast.LENGTH_SHORT).show();
}
}
});
规则:
"terminal": {
".read": true,
//".write": "root.child('users').child(auth.uid).child('role').val() === 'admin'",
"$bid": {
"$sid": {
"uid": {
".write": "data.val() === 'null' || data.val() === auth.id"
},
"tempEmail": {
".write": "auth != null"
},
"booked": {
".write": false
},
"email": {
".write": false
}
}
}
},
但是,我收到了一个权限被拒绝的错误。我已经仔细检查了规则,并且我允许任何人写作以确保它不是规则。我怀疑这是因为我试图更新超过1个子节点?但是我也试图只预订1个座位,但仍然会出现此错误。所以我想这可能是因为我正在尝试设置子节点的值,这可能是不允许的。或者我的代码可能有些问题?
编辑:我犯了一个错误,当我将write = true设置为JsonObject的顶部时,它确实有效。