我刚刚开始使用firebase,我很惊讶复杂的东西是多么简单,以及简单的事情是多么复杂。
我需要检查Firebase数据库中是否存在用户,如果存在,我需要获取其密钥和值。
我有密钥,我尝试通过转到我的用户子树并为具有相同密钥(ID)的孩子找到它在数据库中找到它
DatabaseReference root_firebase = FirebaseDatabase.getInstance().getReference();
DatabaseReference users_firebase = root_firebase.child("Users");
DatabaseReference friend_found = users_firebase.child(key_searched_friend);
一旦我拥有它,我会尝试调用某种方法,如
friend_found.getValue();
或
friend_found.child("user_name").getValue();
但它不存在,
这似乎很奇怪,因为我可以做到这两点
friend_found.getKey();
friend_found.child("user_name").getKey();
我无法使用覆盖方法onDataChanged()执行此操作,因为在查询此值时数据不会更改。
这是我的firebase数据库结构:
{
"RoomNames" : {
"Room-KM5cof0jcoMN8a4g6vC" : {
"room_name" : "TESTrOOM"
},
"Room-KM5dg_WPRdEOT4_oJ1r" : {
"room_name" : "testRoom2"
}
},
"Users" : {
"User-KM5ZaGq0xvjQis05CPF" : {
"user_name" : "Enrique"
}
}
}
答案 0 :(得分:5)
你说:我无法通过覆盖方法onDataChanged()执行此操作,因为当我查询此值时数据不会更改
Retrieve Data的指南解释了:
通过将异步侦听器附加到a来检索Firebase数据 FirebaseDatabase引用。听众被触发一次 数据的初始状态,并且在数据发生变化的任何时候都会再次出现。
因此,当您将某个侦听器附加到某个位置时,onDataChanged()会触发并为您提供当前值。
在标题为“一次读取数据”的部分中,指南指出:
在某些情况下,您可能希望一次调用回调 立即删除,例如初始化你的UI元素时 不要期待改变。你可以使用 addListenerForSingleValueEvent()方法简化了这种情况:它 触发一次然后不再触发。
答案 1 :(得分:0)
用法如下:
friend_found.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
String value = dataSnapshot.getValue(String.class);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.e(TAG,"Error while reading data");
}
});
答案 2 :(得分:0)
对于数据库引用对象,与添加事件侦听器的方式相同,也可以使用removeEventListener
将其删除。
而不是像这样创建一个匿名对象
friend_found.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
String value = dataSnapshot.getValue(String.class);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.e(TAG,"Error while reading data");
}
});
您可以创建 ValueEventListener
的命名对象,并在 removeEventListener
方法的末尾使用 onDataChange
将其从数据库引用对象中删除
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
String value = dataSnapshot.getValue(String.class);
friend_found.removeEventListener(valueEventListener);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.e(TAG,"Error while reading data");
}
});
friend_found.addValueEventListener(valueEventListener);
onDataChange
方法中的代码只执行一次,因为 ValueEventListener
对象在该方法的最后一行执行后立即被删除。