无法从Firebase数据库检索数据

时间:2020-09-14 08:42:55

标签: java android firebase firebase-realtime-database

enter image description here

我有一个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。但没有结果。

2 个答案:

答案 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!
}

第四个问题在于您使用的名称以大写字母开头。为此,我建议您从以下文章中查看答案:

Firebase Android ListView not being displayed

或者:

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")