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:
// ...
});