如何在firebase中添加计数器?

时间:2017-08-01 01:47:12

标签: java android firebase firebase-realtime-database

所以伙计们,我有数据库:事件和用户。

当某些用户对某个事件有兴趣点击该按钮时,这将在eventHasInterest中将用户添加到事件数据库中,并且在数据库中,用户将添加感兴趣的事件。它已经在工作,但我需要设置一个计数器,有多少人有兴趣,而且它不起作用,只需加一次。我需要点击一下,+ 1,再点击一次-1。

btn_interest.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            databaseEvent.child(getKeyEvent()).addListenerForSingleValueEvent( //get the event by key
                    new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {

                            final Event event = dataSnapshot.getValue(Event.class);
                            user = FirebaseAuth.getInstance().getCurrentUser(); //get the user logged in
                            if(user != null) {

                                databaseUser.orderByChild("userEmail").equalTo(user.getEmail()).addValueEventListener(new ValueEventListener() {
                                    @Override
                                    public void onDataChange(DataSnapshot dataSnapshot) {

                                        for (DataSnapshot userSnapshot: dataSnapshot.getChildren()) {

                                            final User user = userSnapshot.getValue(User.class); // user data logged in

                                            databaseUser.orderByChild("userHasInterest").equalTo(event.getEventId()).addValueEventListener(new ValueEventListener() {
                                                @Override
                                                public void onDataChange(DataSnapshot dataSnapshot) {
                                                    if (!dataSnapshot.exists()) {
                                                        databaseUser.child(user.getUserId()).child("userHasInterest").child(event.getEventId()).setValue(event.getEventId());
                                                        databaseEvent.child(event.getEventId()).child("eventAmount").setValue(dataSnapshot.getChildrenCount()+1);
                                                    } else {
                                                        //event already exists
                                                    }
                                                }


                                                @Override
                                                public void onCancelled(DatabaseError databaseError) {
                                                }
                                            });

                                            databaseEvent.orderByChild("eventHasInterest").equalTo(user.getUserId()).addValueEventListener(new ValueEventListener() {
                                                @Override
                                                public void onDataChange(DataSnapshot dataSnapshot) {
                                                    if(!dataSnapshot.exists()){
                                                        databaseEvent.child(event.getEventId()).child("eventHasInterest").child(user.getUserId()).setValue(user.getUserId());
                                                    } else{
                                                        //user already exist
                                                    }
                                                }

我的火力: enter image description here

1 个答案:

答案 0 :(得分:1)

dataSnapshot.getChildrenCount()不返回eventAmount的int值,它返回eventAmount具有的子节点数。在您的情况下,eventAmount将始终返回0,因为没有eventAmount的子项。我建议不要使用getChildrenCount,而是获取dataSnapshot的值,并将该值解析为int。之后,将该值递增1,然后存储该值。

// Create a reverse order comparator
        Comparator r1 = Collections.reverseOrder();
        Collections.sort(ll, r1);

        Comparator r2 = Collections.reverseOrder();
        Collections.sort(ll, r2);

        Comparator r3 = Collections.reverseOrder();
        Collections.sort(ll, r3);
编辑:根据Frank的建议,建议使用事务存储值以帮助避免并发更新。我使用this post以及Frank链接来帮助编写代码。

databaseEvent.child(event.getEventId()).child("eventAmount").setValue(Integer.parseInt(dataSnapshot.getValue().toString()) + 1);

所以在你的“userHasInterest”onDataChange方法中,像这样调用上面的方法。

public void updateCount(DatabaseReference database){
    database.runTransaction(new Handler() {
        @Override
        public Result doTransaction(MutableData mutableData) {

            //Currently no value in eventAmount
            if(mutableData.getValue() == null){
                mutableData.setValue(1);
            }
            else{
               mutableData.setValue(Integer.parseInt(mutableData.getValue().toString()) + 1);
            }
            return Transaction.success(mutableData);
        }

        @Override
        public void onComplete(DatabaseError databaseError, boolean b,
            DataSnapshot dataSnapshot) {
                //Probably log the error here.
        }
    });
}