【问题标题】:How to refer sub child in realtime firebase in android?如何在android的实时firebase中引用子孩子?
【发布时间】:2021-05-17 04:44:12
【问题描述】:

我将通过匹配存储在实时数据库中的注册号来查找学生出勤率。我正在努力获取学生的注册号和学生访问学校的日期。

final FirebaseDatabase databs= FirebaseDatabase.getInstance();
DatabaseReference p = databs.getReference("StudentAttend");
Query q= p.child("reg_no").orderByChild("date").equalTo(Parent_HomePage.childR)

这是我获取它们的查询。但问题是注册号和日期在数据库中没有名称,它们是键。请帮助我从数据库中获取这些属性。其次请分享数据快照代码,因为我的视图没有显示任何内容。

谢谢

【问题讨论】:

  • 你对学生了解多少? ID 或日期之类的?
  • 在“StudentAttend”下,我看不到任何“reg_no”,也看不到“date”属性。它是正确的架构吗?
  • @AlexMamo 是的,这就是问题所在。 14-03-2021 是日期,165 是 reg_no。这些属性没有任何名称。我不知道我将如何接近他们。
  • 那么你到底想得到什么?
  • @AlexMamo 基本上在我的应用程序中,家长可以检查孩子的出勤情况。在这里,孩子的出勤率被保存了。每当家长检查 165 人上学的所有日期时,都会向家长显示。

标签: java android firebase firebase-realtime-database mobile


【解决方案1】:

要从实时数据库中获取密钥,请使用 getKey()。但我不得不说你必须更好地构建你的数据。此外,由于日期在 reg no 之前,您的查询也不起作用。如图所示按日期排序会导致问题,例如 03-03-2021 将在 20-02-2021 之前出现。

       final FirebaseDatabase databs= FirebaseDatabase.getInstance();
       DatabaseReference p = databs.getReference("StudentAttend");

       p.addListenerForSingleValueEvent(new ValueEventListener() {
           @Override
           public void onDataChange(DataSnapshot dns) {
               for (DataSnapshot snapshot : dns.getChildren()) {
                   String key = dns.getKey(); //this will get the date
                   //to get the student number within a date use above key
                   p.child(key).addListenerForSingleValueEvent(new ValueEventListener() {
                         @Override
                         public void onDataChange(DataSnapshot dns) {
                             for (DataSnapshot snapshot : dns.getChildren()) {
                                 String key = dns.getKey(); //this will get the reg_no
                                 //get pick and drop here

                    }
              }}}
                        
         }

有日期时查询数据

           final FirebaseDatabase databs= FirebaseDatabase.getInstance();
           DatabaseReference p = databs.getReference("StudentAttend").child(date_you_have); //then add listener here

如果您没有日期但有注册号,请按照上面的代码获取日期键,然后在其中运行查询

p.child(key).child(regnoyouhvae);

但我建议您再次阅读文档并阅读一些有关构建数据、查询等的文章。

【讨论】:

  • 日期在 reg_no 之前,因为每个学生的出勤率都是相对于日期保存的。在哪一天,哪些学生在场。
【解决方案2】:

根据你上一条评论:

我想在我的 ListView 中显示孩子 165 岁的日期。

若要在 DataSnapshot 对象包含名为“165”的子对象时显示键(日期),请使用以下代码行:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference studentAttendRef = rootRef.child("StudentAttend");
studentAttendRef.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DataSnapshot> task) {
        if (task.isSuccessful()) {
            for (DataSnapshot ds : task.getResult().getChildren()) {
                if (ds.child("165").exists()) {
                    Log.d("TAG", ds.getKey());
                }
            }
        } else {
            Log.d("TAG", task.getException().getMessage()); //Don't ignore potential errors!
        }
    }
});

logcat 中的结果将是:

14-03-2021
15-04-2021

为了能够在 ListView 中显示这些日期,请查看我在以下帖子中的回答:

【讨论】:

  • 是的,你明白了。现在我想不管 reg_no 显示日期。根据用户输入可能是 165 或 206。
  • 只需传递一个可以保存您需要的值的变量。像“ds.child(numberYouNeed)”这样的东西,不是硬编码值,对吧?
  • 好的,非常感谢
  • 我输入了上面的代码并且 .get() 不被接受。它在 .get() studentAttendRef.get().addOnCompleteListener(new OnCompleteListener&lt;DataSnapshot&gt;() 上显示错误
  • 您很可能没有最新版本的 Firebase 实时数据库。更新它并告诉我它是否有效。
猜你喜欢
  • 1970-01-01
  • 2018-03-12
  • 2020-12-17
  • 2018-04-28
  • 2019-05-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
相关资源
最近更新 更多