【问题标题】:Data not retrieving from Firebase database未从 Firebase 数据库检索数据
【发布时间】:2020-09-14 08:42:55
【问题描述】:

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

【问题讨论】:

  • 如果您删除 startAt AND orderBy?你有什么价值吗?
  • 是的....然后给出结果
  • 现在添加orderbychild,如果不起作用,请尝试添加具有相同ID的新通知

标签: java android firebase firebase-realtime-database


【解决方案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

如果你的类中的字段是小写的。

【讨论】:

    【解决方案2】:

    改变这个:

     DbRef2.child("45961").orderByChild("FromId").startAt("22222").addListenerForSingleValueEvent(new ValueEventListener() {
    

    进入这个:

    DbRef2.orderByChild("FromId").startAt("22222").addListenerForSingleValueEvent(new ValueEventListener() {
    

    如果您想在orderByChild() 中使用FromId,则无需访问child("45961")

    【讨论】:

    • 我在它工作之前尝试过,但结果是空值。所以我添加了那个父子(45961)
    猜你喜欢
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    相关资源
    最近更新 更多