无法从fire base数据库获取数据

时间:2016-07-04 07:25:56

标签: android firebase firebase-realtime-database

我正在研究fire base并成功将数据推送到服务器,并能够使用模型类将数据保存到数据库中。我的数据库结构看起来像。

enter image description here

检索数据

    FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
    DatabaseReference mref = firebaseDatabase.getReference();
    mref.orderByChild("jetbro").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot child : dataSnapshot.getChildren()) {
                  Log.d("User val", child.getValue(UserModel.class).getName());// Null Pointer
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

更新代码:

    FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
    DatabaseReference mref = firebaseDatabase.getReference();

    mref.orderByChild("jetbro").addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                Log.d("User val", dataSnapshot.getValue(UserModel.class).getName());
        }

        @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) {

        }
    });

但它给了我空指针异常。以前有人可以吗?

提前帮助将不胜感激!

3 个答案:

答案 0 :(得分:0)

首先,如果您想从random key内部获取孩子,则应使用addChildEventValueListerner代替addListenerForSingleValueEvent,因为它会给出直接值,即random key作为孩子,而addChildEventValueListerner逐个为jetbro节点的孩子提供

如果你认为我只是想一次性使用它addChildEventValueListerner,只会在添加,更改,删除时提供数据

这是非常有用的

 mRef.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            Log.d("User val",datasnapshot);
        }

        @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) {

        }
    });

答案 1 :(得分:0)

class DataModel{
  String message,timeStamp;
  DataModel(String message, String timeStamp){
     this.message = message;
     this.timeStamp = timeStamp;
  }

  DataModel(){
  }
}

制作如上所述的数据模型(确保firebase数据库中的键名和数据模型中的变量具有相同的名称

使用ChildEventListener检索带有Reference的数据

mRef.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            DataModel data = dataSnapshot.getValue(DataModel.class);

            //here you can now access your message and timestamp data
            data.message 
            data.timeStamp
        }

        @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) {

        }
    });

我不知道userModelFirebase节点中的内容是什么,但您必须为DataModel本身的内容创建一个新的UserModel类。 然后是Arraylist课程中名为userModel的{​​{1}}。

答案 2 :(得分:0)

最后我解决了问题:

 FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
    DatabaseReference mref = firebaseDatabase.getReference();
    mref.child("jetbro").addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            ChatModel chatModel = dataSnapshot.getValue(ChatModel.class);
            UserModel usermodel = chatModel.getUserModel();
        }

        @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) {

        }
    });