如何获取父子项内部的子项计数



数据库规则

我的数据库

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

所有用户帖子的 ID 必须如下所示

[用户1]

后 Id1

后 Id2

postId3

后 ID4

后 ID5

.

.

帖子 ID100000


[用户 2]

后 Id1

后 Id2

postId3

后 ID4

后 ID5.

.

帖子 ID100000

......

......

        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) {
                }
            });

        }

private void 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等于最后一个孩子的计数。因此,您始终会获得最后一个用户的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) {
        }
    });
};

最新更新