【问题标题】:Retrieving data from particular nodes firebase Database从特定节点 firebase 数据库中检索数据
【发布时间】:2019-02-07 21:18:12
【问题描述】:

我正在开发一个 android 应用程序,现在我陷入了从特定节点检索数据的困境,就像我只想从每个节点检索一个值一样。数据库结构如下图。

如何检索 Firebase 数据库创建的第二个唯一 ID?

【问题讨论】:

  • 你有 AppointmentStatus 父节点的引用吗?
  • 我不知道如何获取 AppointmentStatus 父节点,但我可以获取父键 3dp8ich...ect
  • Alex 你需要有父 id -LLPF0pDH.. 否则有一种解决方法,你必须在 HashMap 中获取 3dp8ich.. 的所有子级,然后必须将其转换为数组然后迭代所有的孩子,一一获取AppointmentStatus的值
  • @Alex 您只想从第一个节点-LLPF0pDH... 或从所有节点获取appointmentStuts 的值?请回复@。
  • @AlexMamo 我只想获取 -LLPF0pdh 节点下的约会数据

标签: android firebase firebase-realtime-database


【解决方案1】:

首先创建一个 POJO 类来获取您想要的值,它的编写方式应该与您在 Firebase 中的编写方式相同。

public class AppointmentsPojo {

    private String appointmentStuts;

    public AppointmentsPojo(){

    }


    public String getAppointmentStuts() {
        return appointmentStuts;
    }

    public void setAppointmentStuts(String appointmentStuts) {
        this.appointmentStuts = appointmentStuts;
    }

}

然后只需在Appointments 内循环以获取每个appointmentStuts

mDatabase.child("Appointments").addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot dataSnapshot) {
    //Looping inside Appointments to get each appointmentsStuts
    for(DataSnapshot snapshot: dataSnapshot.getChildren()){
    AppointmentsPojo ap = snapshot.getValue(AppointmentsPojo.class);
    //Getting each appointmentStuts
     String appointmentStuts = ap.getAppointmentStuts();
     //To get each father of those appointments 
     String key = snapshot.getKey();

      Log.e("Data: " , "" + appointmentStuts );

       }

  }

  @Override
  public void onCancelled(DatabaseError databaseError) {
    System.out.println("The read failed: " + databaseError.getCode());
  }
});

mDatabase 在哪里

DatabaseReference mDatabase;

mDatabase = FirebaseDatabase.getInstance().getReference();

【讨论】:

  • 它有效,但列出了父 id 下的所有可用值,我只想显示其键下的约会Stuts,就像现在当我单击按钮时,应用程序显示可用值两次而不是一次
  • 是的,因为它从所有键中获取所有的约会Stuts,你可以添加.orderByKey(keyid).addListener.....
  • keyid 基本上是在 OnDataChange 方法中创建的,所以我如何将它传递给 mDatabase.OrderbyId。我不知道如何传递keyid。提前致谢
  • 您可以将其存储在全局变量中,然后将其传递给其他查询
【解决方案2】:

要仅从第一个对象中获取appointmentStuts 的值,请使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
Query query = rootRef.child("Appointments").child(PostKey).limitToFirst(1);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String appointmentStuts = ds.child("appointmentStuts").getValue(String.class);
            Log.d(TAG, appointmentStuts);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage());
    }
};
query.addListenerForSingleValueEvent(valueEventListener);

【讨论】:

  • 这很酷,如果我想从第二个或第三个中获取价值,我的意思是只要我想要它就可以了
  • 在这种情况下,您应该对特定属性使用如下查询:Query query = rootRef.child("Appointments").child(PostKey).orderByChild("specificProperty").equalsTo("specificValue");。如果您还没有特定属性,则应考虑添加例如uid,在这种情况下,查询应如下所示:Query query = rootRef.child("Appointments").child(PostKey).orderByChild("uid").equalsTo(uid);
  • 请查看我在此 post 中的回答,我还解释了如何获取您的参考资料中缺少的推送 ID。所以有了这个 id,你就可以得到任何你想要的对象。
  • 只有一件事很有帮助,我现在创建了 Appointmentkey 并通过使用 push().getKey() 将其存储为值之一,但现在我必须将这个值与什么相比较。提前致谢
  • 已经把推送的id的值存储起来就好了。在这种情况下,您可以获得该特定值并直接在您的参考中使用它,如下所示:DatabaseReference idRef = rootRef.child("Appointments").child(PostKey).child(pushedId)。而已!现在可以了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 2021-12-28
  • 2020-03-19
  • 1970-01-01
相关资源
最近更新 更多