我创建了一个帮助器类,其中包括我想对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}}
知道我做错了什么吗?
答案 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:在使用ValueEventListener
或ChildEventListener
之前,请先阅读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());
}
});
}