要从Firebase数据库获取项目/儿童列表吗?

时间:2018-08-29 22:39:18

标签: java android firebase firebase-realtime-database

我在弄清楚如何获取Firebase实时数据库中项目/子项数以供我的应用用作 int 值时遇到麻烦。

检查下面的图像:

enter image description here

因此,如您在上面看到的,我有2个孩子 images_list

我要做的是:将 images_list 的项/子项数返回到我的应用中,最初显然等于2,然后将该数字扩展每当我添加更多项目/孩子时。

所以我的问题是,我要实现什么代码来捕获该数据库中的子代数量?然后如何将这个数字转换为int值?我已经尝试了不同的方法,但是到目前为止,还没有找到解决方案。

我希望这是有道理的。非常感谢您的协助!


此处的代码解决方案;我必须将大部分代码从RecyclerView Adapter移到MainActivity才能工作

界面

public interface FirebaseCallback {
    void onCallback(List<String> list);
}

readData方法

private void readData(final FirebaseCallback firebaseCallback) {
    mDatabaseImagesRef = FirebaseDatabase.getInstance().getReference("images_list");
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                String imageItems = ds.getValue(String.class);
                imageList.add(imageItems);
            }

            firebaseCallback.onCallback(imageList);
            Log.i("imageList.size() is: ", String.valueOf(imageList.size()));
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Log.i(LOG_TAG, databaseError.getMessage());
        }
    };
    mDatabaseImagesRef.addListenerForSingleValueEvent(valueEventListener);
}

onCreate()中被叫

readData(new FirebaseCallback() {
        @Override
        public void onCallback(List<String> list) {
            mImageAdapter.notifyDataSetChanged();
        }
    });
RecyclerViewAdapter中的

getItemCount()

@Override
public int getItemCount() {
    return imagesList.size();
}

4 个答案:

答案 0 :(得分:1)

要计算images_list节点下的所有子代,请使用以下代码行:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference imagesListRef = rootRef.child("images_list");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        int count = (int) dataSnapshot.getChildrenCount(); //Cast long to int
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage());
    }
};
imagesListRef.addListenerForSingleValueEvent(valueEventListener);
  

然后如何将这个数字转换为int值?

根据官方文档,getChildrenCount()方法返回long,而不是返回int。因此,您需要将该原语转换为整数。

  

如何从此代码块中提取计数,以便它也可以在此代码之外引用和使用?

您不能简单地将count变量创建为全局变量并在onDataChange()方法之外使用它,因为由于该方法的异步行为,它将始终为0。这意味着,如果尝试在此方法之外使用其结果,则数据尚未完成从数据库的加载,因此无法访问。换句话说,您的count将始终为0。

对此问题的快速解决方案是仅在count方法内使用onDataChange()变量的值,否则我建议您从此 { {3}} ,其中我解释了如何使用自定义回调来完成。您也可以查看此 post 以获得更好的理解。

答案 1 :(得分:0)

尝试

userReference = FirebaseDatabase.getInstance().getReference("images_list");
userReference.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    num = dataSnapshot.getChildrenCount();
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });

答案 2 :(得分:0)

mRef= FirebaseDatabase.getInstance().getReference("images_list");

在侦听器内的“ onDataChange”方法上,使用getChildrenCount()获取图像数量,您可以使用i循环(例举:)来迭代那些子代:

mRef.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {

                    int count = dataSnapshot.getChildrenCount();
                   // here you get your images number

                  for(DataSnapshot ds : dataSnapshot.getChildren()) {
                      String key = ds.getKey()
                      // and here you get the key
                   }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });

答案 3 :(得分:0)

尝试以下代码:

public void onDataChange(@NonNull DataSnapshot snap) {
        int count = (int) snap.getChildrenCount();
        //shows the number of items
}