【问题标题】:onDataChange() method is never reached永远无法达到 onDataChange() 方法
【发布时间】:2022-02-01 13:59:29
【问题描述】:

我正在尝试从 Firebase 检索数据,但我不知道如何操作。我在 Firebase [1] 中有以下数据结构:https://i.stack.imgur.com/vN7Ge.png:

![在此处输入图片描述][1]

我可以检索类别标题(睡眠、减压和放松),但不知道如何检索作者。

dataSnapshot.child("author").getValue(String.class)) ; doesn't work.

.

    databaseReference = FirebaseDatabase.getInstance().getReference().child("Category");
        }
    
        public void getDataFromFirebase() {
            List<ParentItem> parentItemsList = new ArrayList<>();
            databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) {
                    for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
                       String category = dataSnapshot.child("Category").getValue(String.class));
  String author = dataSnapshot.child("author").getValue(String.class));
                        
                    }
                    Log.d("TAG", "onDataChange: "+ parentItemsList);
                }
 

更新 现在我有以下代码来检索数据,但永远无法达到 onDataChange()。

list.add("Milena"); // this word shows in recyclerview
    databaseReference = FirebaseDatabase.getInstance().getReference().child("Category");
    databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
list.add("M");
            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                String category = ds.child("Category").getValue(String.class);
                list.add(category);
                for (DataSnapshot data : dataSnapshot.getChildren()) {
                    author = data.child("author").getValue(String.class);
                    list.add(author);
                }
            }
        }

firebase 规则:

{
  "rules": {
    ".read": "auth==true",
    ".write": "auth==true"
  }
}

我有list.add("Milena") 行,以确保问题出在firebase,而不是recycler 视图本身。回收站视图仅显示单词“Milena”。我有一行作为 OnDataChange 方法 list.add("M") 的第一行。回收站视图不显示该字母。

我已经将 google-services.json 文件添加到我的应用中,并将这一行添加到清单 &lt;uses-permission android:name="android.permission.INTERNET"/&gt;

为什么我仍然无法检索数据?

【问题讨论】:

    标签: java android firebase firebase-realtime-database google-cloud-platform


    【解决方案1】:

    如果你想获取字段作者,你可以像这样循环更多的dataSnapshot

    for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
         String category = dataSnapshot.child("Category").getValue(String.class));
         for(DataSnapshot data : dataSnapshot.getChildren()) { 
             String author = data.child("author").getValue(String.class));
         }
    }
    

    希望这可以解决您的问题:)

    【讨论】:

    • 您好,感谢您的回答。现在我明白了如何做到这一点。但是我有一个问题:onDataChange() 方法从来没有进入过,所以循环从来没有到达过。
    【解决方案2】:

    我认为问题在于您对 Category 的参考点并且您想要作者。在类别和作者之间有 2 个孩子(“睡眠”和“1”)。 所以,我认为最好的办法是改变这一行:

    databaseReference = FirebaseDatabase.getInstance().getReference().child("Category");
    

    在这个:

    databaseReference = FirebaseDatabase.getInstance().getReference().child("Category").child("Sleep").child("1");
    

    【讨论】:

      【解决方案3】:

      要解决此问题,您必须对子项进行两次迭代,如以下代码行所示:

      DatabaseReference db = FirebaseDatabase.getInstance().getReference();
      DatabaseReference categoryRef = db.child("Category");
      categoryRef.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
          @Override
          public void onComplete(@NonNull Task<DataSnapshot> task) {
              if (task.isSuccessful()) {
                  DataSnapshot snapshot = task.getResult();
                  for (DataSnapshot categorySnapshot : snapshot.getChildren()) {
                      String categoryName = categorySnapshot.getKey();
                      Log.d("TAG", categoryName);
      
                      for (DataSnapshot ds : categorySnapshot.getChildren()) {
                          String author = ds.child("author").getValue(String.class);
                          Log.d("TAG", author);
                      }
                  }
              } else {
                  Log.d("TAG", task.getException().getMessage()); //Never ignore potential errors!
              }
          }
      });
      

      但请注意,Category: "Sleep" 的子级不应与 12 等存在于同一级别。由于类别名称已经作为节点的键存在,请删除这些记录:

      通过这种方式,您将避免 ClassCastException,因为在同一级别您有一个具有两个属性和一个字符串属性的对象。所以一旦你删除了这些孩子,上面的代码就可以正常工作了。但是,如果您需要一个节点来包含该信息,我建议您创建一个仅包含类别名称的顶级节点。

      【讨论】:

        猜你喜欢
        • 2011-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-14
        • 2014-11-06
        • 1970-01-01
        相关资源
        最近更新 更多