我有一个Firebase数据库,如图所示。我正在尝试根据某些条件检索数据,但未显示任何结果。
DbRef2 =FirebaseDatabase.getInstance().getReference().child("Notification");
DbRef2.child("45961").orderByChild("FromId").startAt("22222").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()){
Toast.makeText(getApplicationContext(),"hello",Toast.LENGTH_SHORT).show();
Notification notf = dataSnapshot.getValue(Notification.class);
Toast.makeText(getApplicationContext(),"hai"+notf.getFromId(),Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
吐司什么都没显示。我也尝试过equalTo而不是startAt。但没有结果。
答案 0 :(得分:1)
您的代码中有四个问题。第一个是您正在使用的查询。如果要根据条件获取结果,请更改以下查询:
DbRef2.child("45961").orderByChild("FromId").startAt("22222").addListenerForSingleValueEvent(/* ... */);
收件人:
DbRef2.orderByChild("FromId").startAt("22222").addListenerForSingleValueEvent(/* ... */);
由于您需要遍历结果,因此无需进行.child("45961")
调用。
第二个问题是,您将DataSnapshot
对象作为参数,但没有循环获取结果。要实际获得结果,您应该使用以下代码:
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()){
for(DataSnapshot ds : dataSnapshot.getChildren()) {
Toast.makeText(getApplicationContext(),"hello",Toast.LENGTH_SHORT).show();
Notification notf = ds.getValue(Notification.class);
Toast.makeText(getApplicationContext(),"hai"+notf.getFromId(),Toast.LENGTH_SHORT).show();
}
}
}
第三个问题是您没有检查潜在的错误。您也可以考虑使用:
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d("TAG", databaseError.getMessage()); //Don't ignore potential errors!
}
第四个问题在于您使用的名称以大写字母开头。为此,我建议您从以下文章中查看答案:
或者:
how to read firestore sub-collection and pass it to FirestoreRecyclerOptions
如果您的班级中的字段是小写字母。
答案 1 :(得分:0)
更改此:
DbRef2.child("45961").orderByChild("FromId").startAt("22222").addListenerForSingleValueEvent(new ValueEventListener() {
对此:
DbRef2.orderByChild("FromId").startAt("22222").addListenerForSingleValueEvent(new ValueEventListener() {
如果您想在FromId
内使用orderByChild()
,则不需要访问child("45961")