如何计算父子中的子数

how to get count of child inside the parent child

database rules

my database

我在 firebase 数据库中写入数据时遇到问题 它必须使用方法 postId() 为数据提供一个 ID 有时它会给我一个正确的 ID,而另一次它会给我一个错误的 ID 或创建了一个 ID 中的更新数据

所有用户的 id 必须如此 post

[用户 1]

postId1

postId2

postId3

postId4

postId5

.

.

postId100000


[用户 2]

postId1

postId2

postId3

postId4

postId5 .

.

postId100000

................................................ .........

        if (auth.getCurrentUser() != null) {


            mDatabase.child("AdUsersINFO").child(auth.getCurrentUser().getUid()).child(POSTID).setValue(adver,
                    new DatabaseReference.CompletionListener() {
                        @Override
                        public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
                            if (databaseError == null) {


                                Toast.makeText(getContext(), "Data is saved successfully", Toast.LENGTH_LONG).show();

                            } else {

                                Toast.makeText(getContext(), "Data isn,t saved , please try again", Toast.LENGTH_LONG).show();
                            }

                        }
                    });

            mAdUserDatabse = FirebaseDatabase.getInstance().getReference().child("AdUsersINFO").child(auth.getCurrentUser().getUid()).child(POSTID);
            mAdUserDatabse.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {

                    mAdUserDatabse.child("userid").setValue(auth.getCurrentUser().getUid());
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });


        }

私有无效postId() {

    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference().child("AdUsersINFO");
    rootRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            if (snapshot.hasChild(auth.getCurrentUser().getUid())) {
                // run some code

                mAdUserDatabse = FirebaseDatabase.getInstance().getReference().child("AdUsersINFO");
                mAdUserDatabse.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        for (DataSnapshot snap : dataSnapshot.getChildren()) {
                            Log.e(snap.getKey(), snap.getChildrenCount() + "");

                            if (snap.getChildrenCount() != 0) {

                                postId = "postId" + String.valueOf(snap.getChildrenCount() + 1);
                                SharedPreferencesUtils.setStringPreference(getActivity(), "postId", postId);

                            } else {
                                postId = "postId" + String.valueOf(1);
                                SharedPreferencesUtils.setStringPreference(getActivity(), "postId", postId);
                            }


                        }

                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });
            } else {
                postId = "postId" + String.valueOf(1);
                SharedPreferencesUtils.setStringPreference(getActivity(), "postId", postId);
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

}

请救救我的命

你是 运行 一个循环并一次又一次地覆盖 postId 的值,因此 postId 等于最后一个 child 的计数。所以你总是得到最后一个用户的 postId 计数。

所以再看一遍

for (DataSnapshot snap : dataSnapshot.getChildren()) {
                        Log.e(snap.getKey(), snap.getChildrenCount() + "");

                        if (snap.getChildrenCount() != 0) {

                            postId = "postId" + String.valueOf(snap.getChildrenCount() + 1);
                            SharedPreferencesUtils.setStringPreference(getActivity(), "postId", postId);

                        } else {
                            postId = "postId" + String.valueOf(1);
                            SharedPreferencesUtils.setStringPreference(getActivity(), "postId", postId);
                        }


                    }

考虑为每个用户的 postId 使用单独的密钥,或者制作一个函数来为一个用户获取密钥,类似这样

public void getPostId(String userId) {
    final String postId = "post";
    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference().child("AdUsersINFO").child(userId);
    rootRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            long c = snapshot.getChildrenCount();
            if(c==) postId = postId+"1";
            else postId = postId+ c+1;
        },

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
};