在这里,针对特定挑战随机生成的pushId,其中接收方和发送方都有UID。我现在要从一个Activity生成这个pushId,我想从其他一些类或片段中检索这个pushId。我像这样使用Msg_Begin
来检索pushId,以便可以获取特定用户的数据:
Msg_End
虽然使用此方法,但给了我pushId,但问题是它正在检索“挑战”节点中存在的所有pushId,但我只想检索单个pushId wrt挑战。有什么办法可以让我仅检索一个pushId,而不是像Challenge1那样,我只想要1st pushId,而Challenge2是2nd pushId,依此类推。请帮帮我。
答案 0 :(得分:1)
如果要获取第一个pushid,则需要使用addListenerForSingleValueEvent
和查询示例orderByChild
:
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Challenge");
reference.orderByChild("timeChallengeMinute").equalTo("58").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot datas: dataSnapshot.getChildren()){
String keys=datas.getKey();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
addListenerForSingleValueEvent
将读取一次数据,当您使用类似orderByChild
的查询时,您将能够获取相关数据。上面将检索pushid where timeChallengeMinute ="58"
答案 1 :(得分:1)
有两种方法可以实现此目的。第一个方法是一旦生成推入ID,就将其存储起来,以后再在您的参考中需要时使用它。因此,在向数据库中添加Challange
对象时,请使用以下代码行:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference challangeRef = rootRef.child("Challange");
String key = challangeRef.push().getKey();
challangeRef.child(key).setValue(yourChallangeObject);
一旦生成此key
,您就可以在活动中随时使用它。
正如@PeterHaddad在回答中提到的那样,另一种方法是使用Query
。因此,您必须在每个挑战对象下添加一个fixed
属性,以便可以根据它查询数据库。我建议您添加创建挑战的用户的id
。在这种情况下,查询应如下所示:
Query query = challangeRef.orderByChild("uid").equalTo(uid).addListenerForSingleValueEvent(/* ... */);
答案 2 :(得分:0)
要做到这一点,请先参考“挑战”,然后遍历该特定节点内的所有子代,然后使用getKey()
DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference().child("Challenge");
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot snapshot : dataSnapshot.getChildren()){
String pushid = snapshot.getKey();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Toast.makeText(getApplicationContext(), databaseError.getMessage(), Toast.LENGTH_SHORT).show();
}
});