Android Firebase返回从addListenerForSingleValueEvent检索到的值

Android Firebase返回从addListenerForSingleValueEvent检索到的值,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我是Firebase的新手,从Firebase的文档中我学到的是,如果您只想检索一次数据,就要使用addListenerForSingleValueEvent 我的问题是将其集成到我的代码中。 我有这样的数据结构: 现在我想在16032017下添加一个新对象。为此,我必须执行以下步骤: 首先,我必须看看是否存在16032017 我必须看看它有多少个孩子(在这个例子3中) 在获得子节点的数量后,我将使用键3创建一个新的子节点,并插入我的数据值对,该对象如下所示: public class Sti

我是Firebase的新手,从Firebase的文档中我学到的是,如果您只想检索一次数据,就要使用
addListenerForSingleValueEvent

我的问题是将其集成到我的代码中。 我有这样的数据结构:

现在我想在16032017下添加一个新对象。为此,我必须执行以下步骤:

  • 首先,我必须看看是否存在16032017
  • 我必须看看它有多少个孩子(在这个例子3中)
  • 在获得子节点的数量后,我将使用键3创建一个新的子节点,并插入我的数据值对,该对象如下所示:

    public class StimmungAbfrage {
        public Integer Angespannt ;
        public Integer Motiviert;
    }
    
  • 对于其他数据库,这将非常容易。我将完全按照我描述的顺序来实现它。首先读取数据并返回值,然后使用该值插入新数据。但是我找不到使用Firebase实现这一点的方法。因为在Firebase中,首先我必须使用
    addListenerForSingleValueEvent
    读取子节点的数量。我编写了如下代码:

    URL url = new URL(DAL_Utilities.DatabaseURL  +  "players/" + user.getName() + "/Stimmungsabfrage/" + stimmungAbfrage.Date + "/");
    Firebase root = new Firebase(url.toString());
    root.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
    
            long counter = 1;
            counter = dataSnapshot.getChildrenCount();
        }
    
        @Override
        public void onCancelled(FirebaseError firebaseError) {
            Log.d("DAL_User.GetLTSabfrage",firebaseError.getMessage());
        }
    });
    
    但问题是我无法获取
    计数器的值,因为它是
    无效的
    。因此,无法返回数据以在插入过程的另一个函数中使用它。 然后我尝试在
    onDataChange
    中执行读取和插入事务。但这也是不可能的,因为我无法找到将数据传递给这个函数的方法,我想将数据插入数据库。此外,函数无法访问实现了
    addListenerForSingleValueEvent
    的主类的数据,除非我将所有变量设置为全局变量,这不是正确的方法。
    那么,如何使用Firebase实现这个简单的读写过程呢?

    您不必查看父节点是否存在。Firebase是无模式的。此外,--如果没有唯一标识符用作密钥,请使用中所述的推送ID。你不需要这些,遵循指南和最佳实践,它会简单得多。
       ref.child("16032017").addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot snapshot) {
                       for (DataSnapshot postSnapshot : snapshot.getChildren()) {
    
    
                           StimmungAbfrage stim = postSnapshot.getValue(StimmungAbfrage.class);
    
    
                           String string = " Angespannt: "+stim.get Angespannt()+"\nMotiviert: "+stim.getMotiviert();
    
    
                           textView.setText(string);
                       }
                    }});