我正在尝试制作一个在地图上显示用户添加的工作的应用。为此,我尝试创建一个实时Firebase数据库来存储所有作业:
在onCreate方法中,将从Firebase数据库中所有当前作业的列表中添加标记(作业)。
到目前为止,这是我的代码:
DatabaseReference ref1 = database.getReference();
DatabaseReference jobsReference = ref1.child("Jobs");
jobsReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
jobs = new ArrayList<>();
// AddJobHandler is the object I use to store the jobs
for(DataSnapshot jobSnapShot : dataSnapshot.getChildren()) {
AddJobHandler newJob = jobSnapShot.getValue(AddJobHandler.class);
jobs.add(newJob);
}
for(int i = 0; i < jobs.size(); i++) {
Toast.makeText(map.this, jobs.get(i).getDesc(), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
运行该应用程序时,我会得到3次敬酒,但添加的是最近工作的标题。如何将所有作业从数据库添加到作业ArrayList中?
TL; DR:作业ArrayList似乎只添加了最新的作业。如何获取 ArrayList 以添加Firebase Realtime数据库中的所有作业
答案 0 :(得分:0)
每次在dataSnapshot中获得事件时,都会创建一个新的ArrayList,因此只有最后一个。尝试在类的构造函数中或其他地方执行jobs = new ArrayList<>();
。它必须被发射一次。
同样,在执行某些操作之前先检查if (dataSnapshot.exist)
。
答案 1 :(得分:0)
似乎您的代码中只需要进行一项更改,请选中此项
jobs = new ArrayList<>(); //write this in onCreate(); or while declaration in global scope.
您的下方代码
DatabaseReference ref1 = database.getReference();
DatabaseReference jobsReference = ref1.child("Jobs");
jobsReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
// AddJobHandler is the object I use to store the jobs
for(DataSnapshot jobSnapShot : dataSnapshot.getChildren()) {
AddJobHandler newJob = jobSnapShot.getValue(AddJobHandler.class);
jobs.add(newJob);
}
for(int i = 0; i < jobs.size(); i++) {
Toast.makeText(map.this, jobs.get(i).getDesc(), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});