Android - 从DataSnapShot获取对象 - firebase数据库

时间:2017-08-11 00:25:34

标签: android firebase firebase-realtime-database

我创建了一个帮助器类,其中包括我想对FirebaseDatabase中的数据执行的函数和过程。

以下函数旨在获取fireabseDataBase中帖子节点中的所有帖子:

public static Jobs getAllJobs() {

    Posts posts= new Posts();
    postsDBRef= FirebaseDatabase.getInstance().getReference("posts").getRef();

    postsDBRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot jobSnapshot: dataSnapshot.getChildren()) {
                // TODO: handle the post
               String key = jobSnapshot.getKey();
               //here 
               Post post= jobSnapshot.child(key).getValue(Post.class);
              // and here  
               posts.add(post);
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.i(getClass().getName().toString(), ": " + databaseError.getMessage());
        }
    });

    return posts;
}

onDataChange函数中我试图循环数据并检索它,虽然在记录时我确实得到数据但是post对象一直给出Null

以下是firebase DataBase中数据的外观

 {
  "posts" : {
    "-Kr9-ii-ArpC3fLuuGnb" : {
      "address" : "sfhhfg",
      "applied" : false,
      "currency" : "le",
      "description" : "ehdhyf",
      "latitude" : 0,
      "longitude" : 0,
      "noOfWorkers" : 2,
      "rating" : 0,
      "reported" : false,
      "salary" : "1250",
      "title" : "rgchu",
      "userId" : 0
    },
    "-Kr94BDkdEZrmxmjxv_Z" : {
     /../
    },
    "-Kr9Dz3S0BQEYv4VO2l3" : {
   /../
    },
    "-Kr9XqDPUvCRcv0lwFy_" : {
    /../
    }
  }
}

以下是在单个循环中从调试器获得的内容

  

DataSnapshot {key = -Kr9-ii-ArpC3fLuuGnb,value = {address = sfhhfg,   rating = 0,title = rgchu,reported = false,description = ehdhyf,userId = 0,   longitude = 0,noOfWorkers = 2,纬度= 0,货币= le,applied = false,   薪水= 1250}}

知道我做错了什么吗?

2 个答案:

答案 0 :(得分:0)

经过多次试验

.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    Job job = snapshot.getValue(Job.class);
                    System.out.println(job.getTitle());
                }
            }

            @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) {
                Log.i(getClass().getName().toString(), ": " + databaseError.getMessage());
            }
        });

使用.addChildEventListener是我的问题的唯一解决方案,仍然调查原因。

答案 1 :(得分:0)

我已经编辑了你的代码,现在应该可以正常工作了,我以前在几个项目中使用了相同的代码片段。确保你的pojo与json数据匹配,你可以使用this工具让自己更容易。

而且最重要的是,不要使用Firebase作为返回值的函数 - 它违背了它的异步性质。使Firebase执行它的任务然后在闭包内(块)转到下一步。

P.S:在使用ValueEventListenerChildEventListener之前,请先阅读here之间的差异。

public void getAllJobs() {

Posts posts= new Posts();

postsDBRef= FirebaseDatabase.getInstance();

postsDBRef.child("posts").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot jobSnapshot: dataSnapshot.getChildren()) { 
           Post post= jobSnapshot.getValue(Post.class);
           posts.add(post);
        }
     // go to next step from here e.g handlePosts(posts);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.i(getClass().getName().toString(), ": " + databaseError.getMessage());
    }
});

}