如何从 Firebase 实时数据库中获取特定类型的数据?

How can I fetch certain type of data from Firebase Realtime Database?

我知道这方面有很多代码,但我找不到解决我的问题的方法。

我有一个实时数据库:

我必须获取“saluteBossMassima:”

我声明和初始化变量的方式:

DatabaseReference databaseMonster;
String id;

databaseMonster=FirebaseDatabase.getInstance().getReference("monster");
id = databaseMonster.push().getKey();

我尝试的代码:

databaseMonster.child(id).addValueEventListener(newValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        String saluteMassimaBossDB = dataSnapshot.child("monster").child("saluteBossMassima").getValue().toString();
    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {

    }
});

谁能帮帮我?

这行不通:

databaseMonster=FirebaseDatabase.getInstance().getReference("monster");
id = databaseMonster.push().getKey();

当您调用 push() 时,它会生成一个用于写入的新的唯一密钥。这与屏幕截图中的现有密钥相同的可能性为零。


如果您已经知道要读取的节点的密钥,则应将该密钥传递给child():

                   //   specify key here
databaseMonster.child("-MtcylP327pK9pUQB54").addValueEventListener(newValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        String saluteMassimaBossDB = dataSnapshot.child("saluteBossMassima").getValue(String.class);
    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {
        throw error.toException(); //  never ignore errors
    }
});

如果您知道要读取的节点的某些值,但不知道键,则可以使用查询来查找节点:

//  Use a query to select the nodes with a specific value
Query query = databaseMonster.orderByChild("dannoAttaccoCaricato").equalTo(300);
query.addValueEventListener(newValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        //  Loop over the results, since there may be multiple
        for (DataSnapshot monsterSnapshot: dataSnapshot.getChildren()) {
            String id = monsterSnapshot.getKey();
            String saluteMassimaBossDB = monsterSnapshot.child("saluteBossMassima").getValue(String.class);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {
        throw error.toException();
    }
});

现在我们需要遍历dataSnapshot.getChildren(),因为dannoAttaccoCaricato.

可能有多个值为300的节点

如果您对节点一无所知,您能做的最好的事情就是读取所有节点并循环遍历结果:

//  Read all nodes under /monster
databaseMonster.addValueEventListener(newValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot monsterSnapshot: dataSnapshot.getChildren()) {
            String id = monsterSnapshot.getKey();
            String saluteMassimaBossDB = monsterSnapshot.child("saluteBossMassima").getValue(String.class);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {
        throw error.toException();
    }
});