我是关于firebase和android的新手。 阅读一段时间后,我提出了一个关于我的代码的问题:
我无法从我的firebase数据库中读取信息。
这是我的代码:
@Override
protected void onStart() {
super.onStart();
mDatabase = FirebaseDatabase.getInstance().getReference();
DatabaseReference referenceArtista = mDatabase.child("artists");
final List<Pintura> pinturaList = new ArrayList<Pintura>();
referenceArtista.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot artistaSnapshot: dataSnapshot.getChildren()) {
Artista artista = artistaSnapshot.getValue(Artista.class);
pinturaList.addAll(artista.getPinturaList());
}
RecyclerView recyclerViewPintura = (RecyclerView)findViewById(R.id.recyclerView);
recyclerViewPintura.setHasFixedSize(true);
recyclerViewPintura.setLayoutManager(new LinearLayoutManager(getBaseContext(), LinearLayoutManager.VERTICAL,false));
AdapterPintura adapterPintura = new AdapterPintura(getBaseContext(),pinturaList);
recyclerViewPintura.setAdapter(adapterPintura);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
我的数据库结构如下所示: Database
我一直在调试,我看到foreach循环结束时的列表返回null。 (因此我遇到了NullPointerException并且app崩溃了)
提前致谢:)
答案 0 :(得分:0)
您是否可以在onCreate方法中启动您的回收者违规行为,一旦从firebase获取数据,只需更新适配器
pinturaList = new ArrayList<Pintura>();
dataSnapshot.getChildrenCount();
//List<User> list= new ArrayList<User>();
for (DataSnapshot childDataSnapshot : dataSnapshot.getChildren()) {
Artista artista = artistaSnapshot.getValue(Artista.class);
pinturaList .add(user);
}
adapter.update(pinturaList );
答案 1 :(得分:0)
使用ValueEventlistener而不是addListenerForSingleValueEvent然后使用forEach循环,因为如果你有多个
,则返回single或null值答案 2 :(得分:0)
试试这个
private DatabaseReference mFirebaseDatabase;
private FirebaseDatabase mFirebaseInstance;
mFirebaseInstance = FirebaseDatabase.getInstance();
mFirebaseDatabase = mFirebaseInstance.getReference("YOUR TABLE NAME").getRef();
mFirebaseDatabase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.getValue() != null) {
Log.v("dataSnapshot.getValue()", "" + dataSnapshot.getValue());
for (DataSnapshot dss : dataSnapshot.getChildren()) {
HashMap<String, String> map = (HashMap<String, String>) dss.getValue();
//get your values
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
答案 3 :(得分:0)
由于在List<Pintura> pinturaList = new ArrayList<Pintura>();
方法之外声明了onDataChange()
,因此您将获得null。您需要声明并使用它inside that method
并在for loop
之外,否则为null,因为该方法的异步行为,在您将这些Artista
类对象添加到列表。
要解决此问题,请使用以下代码:
referenceArtista.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
final List<Pintura> pinturaList = new ArrayList<Pintura>();
for (DataSnapshot artistaSnapshot: dataSnapshot.getChildren()) {
Artista artista = artistaSnapshot.getValue(Artista.class);
pinturaList.addAll(artista.getPinturaList());
}
Log.d("TAG", artista); // Here is not null
RecyclerView recyclerViewPintura = (RecyclerView)findViewById(R.id.recyclerView);
recyclerViewPintura.setHasFixedSize(true);
recyclerViewPintura.setLayoutManager(new LinearLayoutManager(getBaseContext(), LinearLayoutManager.VERTICAL,false));
AdapterPintura adapterPintura = new AdapterPintura(getBaseContext(),pinturaList);
recyclerViewPintura.setAdapter(adapterPintura);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
如果您想在onDataChange()
方法之外使用该列表,请参阅此post的答案。