【问题标题】:Android Firebase: How to simply get all the values under a certain key?Android Firebase:如何简单地获取某个键下的所有值?
【发布时间】:2017-04-21 02:20:44
【问题描述】:

为了解决这个问题,是的,在 SO 上有一个类似的问题,但它并没有准确解释我的情况要求我的想法。

在 Firebase 实时数据库中,我有一个看起来像这样的 json 树:

users{
   userid{
       templates{
          templateName1{  // example name that the user saves their template as.
                          // each template is an ArrayList
                  //templateName1 ArrayList contents
            }
          templateName2{ 
                  //templateName1 ArrayList contents
            }
          templateName2{ 
                  //templateName1 ArrayList contents
            }
       }
   }
}

我需要能够在“模板”中列出每个模板,而在其他时候只需获取特定模板的 ArrayList 值。但是我似乎无法弄清楚如何做这个简单的事情。

根据我在文档中搜索/阅读的内容,我的代码应如下所示:

DatabaseReference mTemplateRef = mDatabase.child("users").child(uid).child("templates");

    mTemplateRef.addListenerForSingleValueEvent(
            new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    dataSnapshot.getChildren();

                    // somehow get the values here

                }
    });

当我调试并输入表达式数据 dataSnapshot.getChildren() 时,我可以看到预期的内容,但我似乎无法将该数据输入我的应用程序。有任何想法吗?

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    这就是我要找的东西:

    settingsRef.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for(DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()){
                    // easy
                    String value = dataSnapshot1.getValue(String.class);                    
                }
            }
    
            @Override
            public void onCancelled(DatabaseError databaseError) {
    
            }
        });
    

    【讨论】:

      【解决方案2】:

      建议您为带有 getter、空和参数化构造函数的模板创建一个类,如图所示

      public class Template {
      
          String name;
          ArrayList<String> list;
      
          public Template() {
          }
      
          public Template(String name, ArrayList<String> list) {
              this.name = name;
              this.list = list;
          }
      
          public String getName() {
              return name;
          }
      
          public ArrayList<String> getList() {
              return list;
          }
      } 
      

      现在你可以轻松做到这一点

          databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
              @Override
              public void onDataChange(DataSnapshot dataSnapshot) {
      
                  for(DataSnapshot data : dataSnapshot.getChildren()){
      
                      Template template = data.getValue(Template.class);
                      // use this object and store it into an ArrayList<Template> to use it further
      
                  }
      
              }
      
              @Override
              public void onCancelled(DatabaseError databaseError) {
      
              }
          });
      

      【讨论】:

      • 嗯,我还是有问题。这将如何让我列出关键“模板”下的所有 ArrayLists?也许有一个单独的 ArrayList 每次迭代都会添加到?这是如何将 ArrayList 设置为您的模板类的?我也收到此错误:com.google.firebase.database.DatabaseException: Can't convert object of type java.util.ArrayList to type com.app.template_editor.template
      • 我将保留我之前的评论,以防你看到任何明显的东西,但我想我知道该怎么做,直到今天放学后我才能测试它。如果成功我会更新
      • 所以,现在我按照你说的做了,但是我收到一个错误,我“无法将 ArrayList 类型的对象转换为 Template 类型”,而 Template 是你提供的类。跨度>
      • 看看这个数组 - link
      【解决方案3】:

      类似这样的代码:

      mTemplateRef.addListenerForSingleValueEvent(
                  new ValueEventListener() {
                      @Override
                      public void onDataChange(DataSnapshot dataSnapshot) {
                      // dataSnapshot  itself  a child of   "templates"   
               DataSnapshot messageSnapshot= dataSnapshot;
                          DataType author =         (DataType)messageSnapshot.child("array").getValue();
      
                          // somehow get the values here
      
                      }
          });
      

      【讨论】:

        猜你喜欢
        • 2013-01-16
        • 2011-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-17
        • 2018-04-16
        • 1970-01-01
        相关资源
        最近更新 更多