从firebase数据库中检索一些数据,其中一些节点为null

时间:2017-10-17 07:01:42

标签: java android firebase firebase-realtime-database

enter image description here

cBankRef=myRef.child("user_id").child("ASSETS");


 cBankRef.addChildEventListener(new ChildEventListener() {
                    @Override
                    public void onChildAdded(DataSnapshot dataSnapshot, String s) {

                        String value = dataSnapshot.child("1").child("description").getValue(String.class);
                        Log.d(TAG, "onChildAdded: the value is"+value);


                        if(dataSnapshot.child("2").exists()) {
                            String valuess = dataSnapshot.child("3").child("description").getValue(String.class);
                            Log.d(TAG, "onChildAdded: the value is: " + valuess);

                        }
                        if (dataSnapshot.child("3").exists()) {
                            String values = dataSnapshot.child("1").child("description").getValue(String.class);
                            Log.d(TAG, "onChildAdded: the cash at bank is: "+values);
                        }

                        }



                    @Override
                    public void onChildChanged(DataSnapshot dataSnapshot, String s) {

                    }

                    @Override
                    public void onChildRemoved(DataSnapshot dataSnapshot) {

                    }

                    @Override
                    public void onChildMoved(DataSnapshot dataSnapshot, String s) {

                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });

首先我访问了user_id子节点和ASSETS然后通过节点(“1”),(“2”)我必须添加其他节点才能获得值,(“1”)和(“2 “)是(”现金在银行“)(”股票“)在开始但我决定将它们改为数字,但它给了null @makrand pawar

2 个答案:

答案 0 :(得分:0)

您的示例中有多个问题:

  • 您的cBankRef指向\user_id\ASSETS\Cash at bank\stock\Cash in Hand,该Cash at bank不存在(ASSETS下不存在ChildEventListener个节点。)
  • 然后您将onChildAdded()附加到此引用,该引用不会返回任何值,因为它下面没有任何子代(因为它不存在)。
  • houses内,您正在尝试访问示例中不存在的house节点(Stock会这样做。)

要访问ref = FirebaseDatabase.getInstance().getReference().child("user_id").child("ASSETS").child("Stock"); ref.addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapshot, String s) { String value = dataSnapshot.child("house").child("values").getValue(String.class); Log.d(TAG, "onChildAdded: the value is: "+value); } // ... }); 节点下的子节点,您需要以下内容:

SELECT

DatabaseReference#child()方法一个ASSETS语句。要访问节点下的所有内容,您只需要创建对所需最高节点的引用,然后将侦听器附加到该节点。

例如,如果您需要访问ref = FirebaseDatabase.getInstance().getReference().child("user_id").child("ASSETS"); ref.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { String value = dataSnapshot.child("Stock").child("house").child("values").getValue(String.class); Log.d(TAG, "onChildAdded: the value is: "+value); if (dataSnapshot.child("Cash at bank").exists()) { String value = dataSnapshot.child("Cash at bank").getValue(String.class); Log.d(TAG, "onChildAdded: the cash at bank is: "+value); } } // ... }); 节点下的所有内容,则可以在那里附加一个侦听器:

ASSETS

然后,当侦听器返回时,您可以使用DataSnapshot#child()来访问从该位置检索的各个值。此外,使用DataSnapshot#exists()是一种在使用节点之前检查节点是否存在的简单方法。

如果您计划在text下拥有当前不存在的其他值或节点,则上述侦听器将在创建后立即返回这些值或节点。

答案 1 :(得分:0)

为实现这一目标,我建议您使用ValueEventListener这样:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference stockRef = rootRef.child("user_id").child("ASSETS").child("Stock");
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String values = ds.child("house").child("values").getValue(String.class);
            Log.d("TAG", values);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
stockRef.addListenerForSingleValueEvent(eventListener);
相关问题