【问题标题】:Getting data from nested children Firebase Realtimebase Database从嵌套的子 Firebase Realtimebase 数据库中获取数据
【发布时间】:2020-12-29 04:14:55
【问题描述】:

我最近一直在使用 Firebase。 ​​​ 我有一个问题,因为有一部分不能很好地工作。 ​​​ 我想要的只是a、b和c的总值。

a 是多少,b 是多少,c 是多少? ​​​ 这看起来很简单,但它并没有像我想象的那样工作。

myRef.addListenerForSingleValueEvent(object : ValueEventListener {
  override fun onDataChange(p0: DataSnapshot) {
    for (snapshot in p0.children) {
      var ref = snapshot.key
      Log.d ("Test", snapshot.key) // get A,B,C,Name
      Gets the contents of the log.d("bell", p0.child("A").value.toString())) // A
    }
  }
});

​ 我们可以通过上面的方式得到a,b,c的总和,但是我想实现流体部分。 ​​​ 可能有 H 也可能有 C,我想处理潜台词数量的差异。 ​​​ 我一直在考虑Arraylist。我担心如果以这种方式存储它会变得更加复杂。 ​​​ 我写信看看能不能得到一些帮助。

【问题讨论】:

    标签: android firebase kotlin firebase-realtime-database


    【解决方案1】:

    如果要获取每个节点下存在的所有值,a、b、c、d、e等,无论有多少孩子,都需要查询数据库两次。因此,假设“timedata”节点是您的 Firebase 实时数据库根的直接子节点,并且长 id 是登录用户的 UID,请使用以下代码行:

    val uid = FirebaseAuth.getInstance().currentUser!!.uid
    val rootRef = FirebaseDatabase.getInstance().reference
    val uidRef = rootRef.child("timedata").child(uid)
    val valueEventListener: ValueEventListener = object : ValueEventListener {
        override fun onDataChange(dataSnapshot: DataSnapshot) {
            var total: Long = 0
            for (ds in dataSnapshot.children) {
                for (dSnapshot in ds.children) {
                    val value = dSnapshot.getValue(Long::class.java)!!.toLong()
                    total += value
                }
            }
            Log.d(TAG, "total: $total")
        }
    
        override fun onCancelled(databaseError: DatabaseError) {
            Log.d("TAG", databaseError.message) //Don't ignore potential errors!
        }
    }
    uidRef.addListenerForSingleValueEvent(valueEventListener)
    

    这是为 Java 用户准备的:

    String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference uidRef = rootRef.child("timedata").child(uid);
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            long total = 0;
            for(DataSnapshot ds : dataSnapshot.getChildren()) {
                for(DataSnapshot dSnapshot : ds.getChildren()) {
                    long value = Long.parseLong(dSnapshot.getValue(Long.class));
                    total += value;
                }
            }
            Log.d(TAG, "total: " + total);
        }
    
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Log.d("TAG", databaseError.getMessage()); //Don't ignore potential errors!
        }
    };
    uidRef.addListenerForSingleValueEvent(valueEventListener);
    

    根据您的屏幕截图,您的 logcat 中的结果将是:

    53032
    

    【讨论】:

    • 你真好。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 2019-07-23
    • 2017-07-13
    • 1970-01-01
    相关资源
    最近更新 更多