2017-08-11 70 views
0

我创建了一个助手类,其中包括我想对FirebaseDatabase中的数据执行的函数和过程。Android - 从DataSnapShot获取对象 - firebase数据库

下面的函数是为了让所有的帖子在帖子节点在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功能,我在数据试图环和检索,虽然同时记录我得到的数据,但帖子对象不断给空

这里的数据看怎么样在火力数据库

{ 
    "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_" : { 
    /../ 
    } 
    } 
} 

这里就是上午摹从Debugger ETTING在单个环路

DataSnapshot {键= -Kr9-II-ArpC3fLuuGnb,值= {地址= sfhhfg, 评级= 0,标题= rgchu,报道=假,描述= ehdhyf,用户id = 0, 经度= 0,noOfWorkers = 2,纬度= 0,货币=乐,应用=假, 工资= 1250}}

任何想法,我究竟做错了什么?

+0

我们无法知道'getDataBaseReference(“posts”)'返回了什么,我们也不知道'posts'中的JSON是什么样的。请确保您的问题包含[重现问题所需的最低完整信息](http://stackoverflow.com/help/mcve)。当你分享JSON时,一定要将它作为文本分享(没有截图)。您可以通过点击[Firebase数据库控制台](https://console.firebase.google.com/project/_/database/data)中的“导出JSON”链接来获取此信息。 –

+0

@FrankvanPuffelen增加了额外的信息,谢谢你指出缺失的信息 –

+0

getReference(“posts”)。getRef()' - >'getReference(“posts”)'。结果是一样的,但它会为我节省双倍的费用。 –

回答

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后是我的问题,还是调查的原因,唯一的解决办法。

0

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

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

P.S:使用前ValueEventListenerChildEventListenerhere中读取它们之间的差异。

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()); 
    } 
}); 

} 
相关问题