Java 获得孩子的最佳方式';firebase中具有随机密钥的s节点数据?

Java 获得孩子的最佳方式';firebase中具有随机密钥的s节点数据?,java,android,json,firebase,firebase-realtime-database,Java,Android,Json,Firebase,Firebase Realtime Database,这是一对多的关系:一个作家有很多书 authors: randomAuthorId1: authorId: authorName: randomAuthorId2: authorID: authorName: books: randomAuthorId1: randomBookId1: bookId: bookName: ra

这是一对多的关系:一个作家有很多书

authors:
    randomAuthorId1:
        authorId: 
        authorName:
    randomAuthorId2:
        authorID: 
        authorName:
books:
    randomAuthorId1:
        randomBookId1:
            bookId:
            bookName:
        randomBookId2:
            bookId:
            bookName:
    randomAuthorId2:
        randomBookId3:
            bookId:
            bookName:
在我的例子中,我没有“randomAuthorId1”,但我有“randomBookId2”,这是我获取randomBookId2节点值的代码:

DatabaseReference bookRef = FirebaseDatabase.getInstance().getReference("books");
bookRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot data : dataSnapshot.getChildren()) {
            if (data.hasChild("randomBookId2")) {
                Book book = data.child("randomBookId2").getValue(Book.class);
            }
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});
因此,它必须遍历所有子节点才能获得randomBookId2的节点。有更好的办法吗?
谢谢大家

如果您知道要获取哪个值的子项名称,则无需在eventlistener中调用hasChild。只需引用特定子项并将其放入try-catch即可。所以,若并没有找到子对象,那个么您可以捕获异常并根据需要执行操作

示例代码:

try
{
    DatabaseReference bookRef = FirebaseDatabase.getInstance().getReference("books").child("randomBookId2");
    //add valueevent listener for this reference...
}catch(Exception e){
    //Child not found...perform action according this.
}

您可以使用Query来完成此操作,但使用Query您需要更新您的图书数据库,如下所示。
书籍:

现在,在这之后,您可以像下面那样启动查询

Query queryToGetData = databaseReference.child("books")
        .orderByChild("randomBookId").equalTo("randomBookId2");
queryToGetData.addChildEventListener(new ChildEventListener() {
    // TODO: 
    // ...
});

它将帮助您。

没有父子关系,您无法直接连接子-子连接。Dhaval Solanki的答案是正确的。调用dataSnapshot时,无父子连接总是返回空值。getValue()我调用了
.orderByChild(“randomBookId”)
,它不是查找randomBookId 1节点或randomBookId 2节点的randomBookId,而是查找randomAuthorId1节点和randomAuthorId2节点的randomBookId。我无法理解您的评论,你能再解释一下吗?对不起,我英语不好。此方法
databaseReference.child(“books”).orderByChild(“randomBookId”)
使用值
null
排序,因为
randomAuthorId1
randomAuthorId2
没有子键
randomBookId
请将.orderByChild(“randomBookId”)替换为.orderByChild(“bookId”)或者更新我在回答中提到的数据库结构。很抱歉回复太晚。它不起作用。如果我在
databaseReference.child(“books”)
中,调用方法
.orderByChild(“bookId”)
,然后该方法的排序值为
null
。因为
bookId
books
的孙子,我无法通过调用方法
orderByChild()
Query queryToGetData = databaseReference.child("books")
        .orderByChild("randomBookId").equalTo("randomBookId2");
queryToGetData.addChildEventListener(new ChildEventListener() {
    // TODO: 
    // ...
});