有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java dataSnapshot无法获取父推送键值

我希望dataSnapshot检查其父项的“摘要”中是否存在“月”。但dataSnapshot返回的结果是“摘要”中没有“月份”

 ds = FirebaseDatabase.getInstance().getReference("summary");
 ds.addListenerForSingleValueEvent(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {
                                //summary
                                String key = ds.getKey();
                                if (dataSnapshot.hasChild("month")) {

                                    Toast.makeText(newTransaction.this, "got value", Toast.LENGTH_LONG).show();
                                } else {
                                    Toast.makeText(newTransaction.this, "No value", Toast.LENGTH_LONG).show();
                                }
                            }

我的Firebase数据库:我想检查来自其父数据库(红线)的值(蓝线)

My Firebase Database


共 (1) 个答案

  1. # 1 楼答案

    以下代码行:

    String key = ds.getKey();
    

    返回引用所指向的节点的键,在本例中为summary。在summary节点和month属性之间,在您的结构中还有另一个级别,实际上是被按下的键(-MJKC…xGZX)。为了检查该属性是否存在,还需要在引用中使用该键。假设summary节点是Firebase数据库根目录的直接节点,请使用以下代码行:

    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference keyRef = rootRef.child("summary").child("-MJKC_JkVFpCdCGqxGZX");
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.hasChild("month")) {
                Toast.makeText(newTransaction.this, "got value", Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(newTransaction.this, "No value", Toast.LENGTH_LONG).show();
            }
        }
    
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Log.d("TAG", databaseError.getMessage()); //Don't ignore potential errors!
        }
    };
    keyRef.addListenerForSingleValueEvent(valueEventListener);
    

    但是,如果尚未将该键存储到变量中,则应使用查询,如下所示:

    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference summaryRef = rootRef.child("summary");
    Query queryByMonth = summaryRef.orderByChild("month")
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                Toast.makeText(newTransaction.this, "got value", Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(newTransaction.this, "No value", Toast.LENGTH_LONG).show();
            }
        }
    
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Log.d("TAG", databaseError.getMessage()); //Don't ignore potential errors!
        }
    };
    queryByMonth.addListenerForSingleValueEvent(valueEventListener);