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的Record表中后,我将电子邮件中的Rate中的值更改为:“abc”从“2”更改为“1”。更改仅在“帐户”表中进行,但不知何时,“记录”表中保存的记录随“帐户”表中的修改而更改。初始速率:当在账户表中进行更改时,记录表中的“2”变为“1”,其中速率:“2”变为速率:“1”。在搜索之后,我怀疑这是由于strRate的onDataChanged()而发生的。希望得到答案!
答案 0 :(得分:0)
我想你想知道为什么会这样。这正是您所猜测的,您已将价值监听器addValueEventListener()
附加到帐户位置,并且只要该节点发生变化,您就会收到回叫对这个听众。
如果您希望仅发生一次,则应使用singleValueEvent
个侦听器。如果您想要控制何时想要接收值,但又想要使用valueEventListener
,那么您应该保留该听众的引用,并在您不想要它时将其从引用中删除了。