【问题标题】:The best way to get child's node data with random key in firebase?在firebase中使用随机键获取子节点数据的最佳方法?
【发布时间】:2018-09-22 02:25:47
【问题描述】:

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

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 的节点。有没有更好的办法? 谢谢大家

【问题讨论】:

    标签: java android json firebase firebase-realtime-database


    【解决方案1】:

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

    randomAuthorId1:  
       randomBookId1:
            bookId:  
            randomBookId:randomBookId1
            bookName:
       randomBookId2:
            bookId:
            randomBookId:randomBookId2
            bookName:
    randomAuthorId2:
        randomBookId3:
            bookId:
            randomBookId:randomBookId3
            bookName:
    

    现在你可以像下面这样触发查询

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

    它会帮助你。

    【讨论】:

    • 我打电话给.orderByChild("randomBookId"),不是寻找randomBookId1节点或randomBookId2节点的randomBookId,而是寻找randomAuthorId1 节点和 randomAuthorId2 节点的 randomBookId
    • 我无法理解您的评论,请您解释一下。
    • 抱歉我的英语不好。这个方法databaseReference.child("books") .orderByChild("randomBookId")null 的值排序,因为randomAuthorId1randomAuthorId2 没有子键randomBookId
    • 请将 .orderByChild("randomBookId") 替换为 .orderByChild("bookId") 或更新我在回答中所说的数据库结构。
    • 抱歉回复晚了。它不起作用。如果我在databaseReference.child("books"),调用方法.orderByChild("bookId"),然后该方法以null 的值排序。因为bookIdbooks的孙子,我无法通过调用方法orderByChild()得到孙子的值
    【解决方案2】:

    如果您知道要获取哪个值的子名称,则无需在 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.
    }
    

    【讨论】:

    • 你不能直接连接没有父子连接的子子连接。
    • Dhaval Solanki 的回答是正确的。调用dataSnapshot.getValue()时,无父子连接总是返回空值
    猜你喜欢
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多