Record{
Push_key():
{
duration: "30"
rate: "2"
}
}
Account{
Push_key():
{
email:"abc@gmail.com"
Rate:"2"
}
}
上面显示了 Firebase 数据库结构。 我有一个按钮,单击时可以将记录保存到数据库中:
btnSave.setOnClickListener(new OnClickListener(){
public void onClick(View v){
DatabaseReference ref = FirebaseDatabase.getInstance().getReference("Record");
String key = ref.push().getKey();
ref.child(key).child("rate").setValue(strRate);
}
});
其中 strRate 被定义为公共(public)并声明如下:
FirebaseAuth auth = FirebaseAuth.getInstance();
FirebaseUser user = auth.getCurrentUser();
String email = user.getEmail();
DatabaseReference dbRef = FirebaseDatabase.getInstance().getReference("Account");
Query query = ref.orderByChild("email").startAt(email).endAt(email+"\uf8ff");
query.addValueEventListener(new ValueEventListener(){
public void onDataChange(DataSnapshot dataSnapshot){
for (DataSnapshot child : dataSnapshot.getChildren()){
strRate = child.child("Rate").getValue().toString();
...
}
}
});
问题:将记录保存到 firebase 中的记录表中后,我将电子邮件帐户中的费率值:“abc”从“2”更改为“1”。更改仅在帐户表中进行,但不知何故,记录表中保存的记录随着帐户表中所做的修改而更改。当帐户表中的费率:“2”更改为费率:“1”时,记录表中的初始费率:“2”更改为“1”。环顾四周后,我怀疑这是由于该 strRate 的 onDataChanged() 造成的。希望得到答复!
最佳答案
我想你想知道为什么会发生这种情况。正如您所猜测的那样,您已将值监听器 addValueEventListener()
附加到 Accounts 位置,并且只要该节点发生变化,您就会收到对此监听器的回调。
如果您希望这种情况只发生一次,则应该使用 singleValueEvent
监听器。如果您想控制何时接收值,但仍想使用 valueEventListener
,您应该保留该监听器的引用,并在不再需要时将其从引用中删除。
关于Java Firebase 数据库设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49149683/